你真的知道爲何要使用void(0)代替undefined嗎?

咱們平時用到的\(\color{#FF3030}{undefined}\)只是\(\color{#FF3030}{window}\)對象下的一個屬性。javascript

Object.getOwnPropertyDescriptor(window, undefined);
//{value: undefined, writable: false, enumerable: false, configurable: false}

也正是由於如此,致使它在函數做用域中是能夠修改。
但前提要加聲明,由於不加聲明,操做的\(\color{#FF3030}{window.undefined}\),而\(\color{#FF3030}{window.undefined}\)的屬性描述符是:java

屬性
value undefined
writable false
enumerable false
configurable false

\(\color{#FF3030}{value}\)不能修改,不能遍歷,而且\(\color{#FF3030}{屬性描述符}\)也不能修改(不能用\(\color{#FF3030}{Object.defineProperty}\)來修改\(\color{#FF3030}{writable、enumerable、configurable}\)的值)。函數

可是咱們是能夠在\(\color{#FF3030}{函數做用域}\)或者\(\color{#FF3030}{塊級做用域}\)\(\color{#FF3030}{undefined}\)的值進行\(\color{#FF3030}{「修改」}\)的,好比:spa

function fn(){
    undefined = 1111;
    console.log('undefined : ' + undefined);
}
fn();//undefined : undefined

function fn(){
    var undefined = 1111;
    console.log('undefined : ' + undefined);
}
fn();//undefined : 1111

{
    let undefined = 1111;
    console.log('undefined : ' + undefined);//undefined : 1111
}

這是由於在\(\color{#FF3030}{函數做用域}\)或者\(\color{#FF3030}{塊級做用域}\)中也定義了一個\(\color{#FF3030}{undefined}\)變量,在此做用域中就會優先使用新定義的變量,而不會去使用\(\color{#FF3030}{window.undefined}\),從而形成一種咱們將\(\color{#FF3030}{window.undefined}\)的值改變了的假象。code

因此咱們在判斷變量的類型時,最好使用:對象

var obj;
typeof obj ===  'undefined';

而不要去使用:ip

var obj;
obj === undefined;

使用\(\color{#FF3030}{void關鍵字}\)也是能夠的,由於\(\color{#FF3030}{void關鍵字}\)不管如何都會返回\(\color{#FF3030}{undefined}\)作用域

var obj;
obj === void(0);

這也是在實際開發中常用\(\color{#FF3030}{void(0)}\)來代替\(\color{#FF3030}{undefined}\)的緣由了。開發

相關文章
相關標籤/搜索