咱們平時用到的\(\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}\)的緣由了。開發