undefined 和 null
乍一看,似乎 null
和 undefined
基本相同,但是存在細微但重要的差異。
undefined
是編譯器中沒有值,因為它應該是一個值,沒有放置一個,就像未賦值變數的情況一樣。
undefined
是一個全域性值,表示缺少指定值。typeof undefined === 'undefined'
null
是一個物件,表示變數已被明確賦值為無值。typeof null === 'object'
將變數設定為 undefined
意味著變數實際上不存在。某些程序(如 JSON 序列化)可能會從物件中刪除 undefined
屬性。相反,null
屬性表示將被保留,因此你可以明確地傳達空屬性的概念。
以下評估為 undefined
:
- 宣告但未賦值的變數(即已定義)
-
let foo; console.log('is undefined?', foo === undefined); // is undefined? true
-
- 訪問不存在的屬性的值
-
let foo = { a: 'a' }; console.log('is undefined?', foo.b === undefined); // is undefined? true
-
- 不返回值的函式的返回值
-
function `foo()` { return; } console.log('is undefined?', `foo()` === undefined); // is undefined? true
-
- 宣告但已從函式呼叫中省略的函式引數的值
-
function foo(param) { console.log('is undefined?', param === undefined); } foo('a'); foo(); // is undefined? false // is undefined? true
-
undefined
也是全域性 window
物件的屬性。
// Only in browsers
console.log(window.undefined); // undefined
window.hasOwnProperty('undefined'); // true
Version < 五
在 ECMAScript 5 之前,你實際上可以將 window.undefined
屬性的值更改為可能破壞所有內容的任何其他值。