摘要:在閱讀一些框架源碼時(shí),發(fā)現(xiàn)都是用的代替,簡單的了一下運(yùn)算符運(yùn)算符對給定的表達(dá)式進(jìn)行求值,然后返回。在之前,給賦值會覆蓋該屬性。但是由于不是保留字,依然可以在局部作用域中聲明一個(gè)的變量,并改變它的值。
在閱讀一些框架源碼時(shí),發(fā)現(xiàn)都是用的 void 0 代替 undefined,簡單的 Google 了一下:
void 運(yùn)算符void 運(yùn)算符 對給定的表達(dá)式進(jìn)行求值,然后返回 undefined。
void 0; // undefined void ("0"); // undefined void "hello world"; // undefined void function (){return "foo"}() // undefinedundefined
我們經(jīng)常會寫如下判斷
if (foo === undefined) { foo = "foo" }
嚴(yán)格上來說這樣的代碼是不安全的,我們默認(rèn)假設(shè)了 undefined 的值沒有改動(dòng)過。因?yàn)?undefined 不是 JavaScript 的保留字,只是全局變量上的一個(gè)屬性,屬性值是原始值 undefined。在 ECMAScript 5 之前,給 window.undefined 賦值會覆蓋該屬性。從 ECMAScript 5 開始undefined 是一個(gè)不能被配置(non-configurable),不能被重寫(non-writable)的屬性。
Object.getOwnPropertyDescriptor(window, "undefined"); /* { value: undefined, writable: false, enumerable: false, configurable: false } */
但是由于 undefined 不是保留字,依然可以在局部作用域中聲明一個(gè) undefined 的變量,并改變它的值。
function foo () { let undefined = "hello world"; return function (v) { return v === undefined; } } let isUndefined = foo(); let bar; isUndefined(bar); // false isUndefined(undefined); // false isUndefined("hello world"); // true安全的寫法
一種是可以用 typeof,對于原始值 undefined , typeof 始終返回字符串 "undefined"
function foo () { let undefined = "hello world"; return function (v) { return typeof v === "undefined"; } } let isUndefined = foo(); let bar; isUndefined(bar); // true isUndefined(undefined); // true isUndefined("hello world"); // false
另外一種就是 void 運(yùn)算符,void 運(yùn)算符始終返回原始值 undefined
function foo () { let undefined = "hello world"; return function (v) { return v === void 0; } } let isUndefined = foo(); let bar; isUndefined(bar); // true isUndefined(undefined); // true isUndefined("hello world"); // false
當(dāng)然,與 void "hello world" 比較也是可以的,但是 void 0 字符數(shù)更短,寫起來比 typeof 方便。因?yàn)榭蚣艽a不知道自己的執(zhí)行上下文,也就不能假定 undefined 標(biāo)識有沒有被重新賦值過,所以用 void 0 來判斷是不是原始值。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/89056.html
摘要:最近開始看源碼,并將源碼解讀放在了我的計(jì)劃中。相對于其他源碼解讀的文章,基本都會從整體設(shè)計(jì)開始講起,樓主覺得這個(gè)庫有點(diǎn)特殊,決定按照自己的思路,從用代替說起。源碼沒有出現(xiàn)注意,其實(shí)有出現(xiàn)一處,是為,而不是,而用代替之。 Why underscore 最近開始看 underscore源碼,并將 underscore源碼解讀 放在了我的 2016計(jì)劃 中。 閱讀一些著名框架類庫的源碼,就好...
摘要:又是啥是原始類型值之一,也是全局對象的屬性,在部分低級別的瀏覽器中可以被修改,在局部作用域中也可以被修改。所以常見的解決方法是在這個(gè)問題中提到用去替代標(biāo)簽的空屬性會減少頁面請求是否屬實(shí)有待考證結(jié)尾第一篇暫時(shí)寫完了,歡迎大家吐槽和提意見。 前言 原文鏈接 源碼地址 這是underscore.js源碼分析的第一篇文章,為什么選擇寫這篇文章呢?其實(shí)主要有兩點(diǎn) 下劃線源碼中通篇可見這樣的判斷...
摘要:又是啥是原始類型值之一,也是全局對象的屬性,在部分低級別的瀏覽器中可以被修改,在局部作用域中也可以被修改。所以常見的解決方法是在這個(gè)問題中提到用去替代標(biāo)簽的空屬性會減少頁面請求是否屬實(shí)有待考證結(jié)尾第一篇暫時(shí)寫完了,歡迎大家吐槽和提意見。 前言 原文鏈接 源碼地址 這是underscore.js源碼分析的第一篇文章,為什么選擇寫這篇文章呢?其實(shí)主要有兩點(diǎn) 下劃線源碼中通篇可見這樣的判斷...
摘要:原始值就是值本身不可改變,并且沒有方法和屬性。操作的時(shí)候看似操作原始值,其實(shí)是操作它的副本。代表空指針,就是沒有對象存在,它不是全局對象的屬性。這也是為什么需要替代它的原因。別忘了它們是不同的類型栗子參考資料 原始值就是值本身不可改變,并且沒有方法和屬性。操作的時(shí)候看似操作原始值,其實(shí)是操作它的副本。 Null 代表空指針,就是沒有對象存在,它不是全局對象的屬性。Null type對應(yīng)...
閱讀 1323·2021-11-22 14:44
閱讀 2463·2021-09-30 09:47
閱讀 1236·2021-09-09 11:56
閱讀 2101·2021-09-08 09:45
閱讀 4018·2021-08-31 09:40
閱讀 1268·2019-08-30 15:52
閱讀 2054·2019-08-30 14:09
閱讀 1604·2019-08-26 17:04