成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

用 void 0 代替 undefined

leanote / 340人閱讀

摘要:在閱讀一些框架源碼時(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"}() // undefined
undefined

我們經(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

相關(guān)文章

  • void 0 代替 undefined 說起

    摘要:最近開始看源碼,并將源碼解讀放在了我的計(jì)劃中。相對于其他源碼解讀的文章,基本都會從整體設(shè)計(jì)開始講起,樓主覺得這個(gè)庫有點(diǎn)特殊,決定按照自己的思路,從用代替說起。源碼沒有出現(xiàn)注意,其實(shí)有出現(xiàn)一處,是為,而不是,而用代替之。 Why underscore 最近開始看 underscore源碼,并將 underscore源碼解讀 放在了我的 2016計(jì)劃 中。 閱讀一些著名框架類庫的源碼,就好...

    Cc_2011 評論0 收藏0
  • (void 0)與undefined之間的小九九

    摘要:又是啥是原始類型值之一,也是全局對象的屬性,在部分低級別的瀏覽器中可以被修改,在局部作用域中也可以被修改。所以常見的解決方法是在這個(gè)問題中提到用去替代標(biāo)簽的空屬性會減少頁面請求是否屬實(shí)有待考證結(jié)尾第一篇暫時(shí)寫完了,歡迎大家吐槽和提意見。 前言 原文鏈接 源碼地址 這是underscore.js源碼分析的第一篇文章,為什么選擇寫這篇文章呢?其實(shí)主要有兩點(diǎn) 下劃線源碼中通篇可見這樣的判斷...

    novo 評論0 收藏0
  • (void 0)與undefined之間的小九九

    摘要:又是啥是原始類型值之一,也是全局對象的屬性,在部分低級別的瀏覽器中可以被修改,在局部作用域中也可以被修改。所以常見的解決方法是在這個(gè)問題中提到用去替代標(biāo)簽的空屬性會減少頁面請求是否屬實(shí)有待考證結(jié)尾第一篇暫時(shí)寫完了,歡迎大家吐槽和提意見。 前言 原文鏈接 源碼地址 這是underscore.js源碼分析的第一篇文章,為什么選擇寫這篇文章呢?其實(shí)主要有兩點(diǎn) 下劃線源碼中通篇可見這樣的判斷...

    Arno 評論0 收藏0
  • Js基礎(chǔ)——數(shù)據(jù)類型之Null和Undefined

    摘要:原始值就是值本身不可改變,并且沒有方法和屬性。操作的時(shí)候看似操作原始值,其實(shí)是操作它的副本。代表空指針,就是沒有對象存在,它不是全局對象的屬性。這也是為什么需要替代它的原因。別忘了它們是不同的類型栗子參考資料 原始值就是值本身不可改變,并且沒有方法和屬性。操作的時(shí)候看似操作原始值,其實(shí)是操作它的副本。 Null 代表空指針,就是沒有對象存在,它不是全局對象的屬性。Null type對應(yīng)...

    jubincn 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<