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
属性的值更改为可能破坏所有内容的任何其他值。