我最近在调试时了解到,undefined是一种数据类型,null是一个对象。
我认为它们都属于数据类型。
我检查了未定义的类型和空的类型。它们分别返回"未定义">和"对象"。
typeof undefined
"undefined"
typeof null
"object"
有人可以解释为什么这种奇怪的行为吗?
typeof null
成为对象是一个早期的错误 - 当他们尝试每晚在Chrome中更正它时(typeof null === "null"
),太多的东西依赖于当前的行为,太多的代码被破坏了。
未设置为正常值的 JavaScript 对象通常具有三种状态:
- 未申报的。
- 定义。
- 明确没有。
未申报的
例如 - 这种情况:
y++; //I did not declare y before, this causes a reference error
y === 'undefined'; //still a reference error
typeof y; //'undefined', since typeof is an operator and not a function.
基本上,未声明的变量处于"脚本不知道此变量"的状态。
定义
这意味着运行时"知道这个变量",但它还没有设置为任何东西。或者,正如语言规范所说:
未定义的值 - 未为变量赋值时使用的基元值。
例如:
var y; //y is undefined
y === undefined; //true, y defined the line above
typeof y; //undefined, but this is redundant, just do `=== undefined`
(function(x){ /* x is undefined here as it was set to nothing*/})()
明确没有
当你有一个应该有价值的东西,但你想声明它什么都不是。或者,正如语言规范所说:
null 值 - 表示有意缺少任何对象值的基元值。
例如,如果具有给定 ID 的元素不在 DOM 中,document.getElementById("foo");
返回null
以指示显式未返回任何内容。使用没有 return 语句的函数与此相反,因此它们返回默认值undefined
。
它们具有不同的类型,原因与它们都存在的原因相同:undefined
和null
在概念上不是一回事。
正如这个答案所说:
未定义表示缺少类型和值,null 表示缺少值。
但我更喜欢应用现实世界的类比:物质与暗物质。
undefined
就像不存在的物质。它没有形式或实质,因此没有有意义的类型。你设置了一些东西来undefined
当它不应该被视为存在时。
另一方面,null
,在计算机科学领域,描述了一个未知状态的对象。它仍然是一个对象,但我们不知道是什么对象或它的价值是什么。(从这个意义上说,它类似于数字NaN
在概念上仍然是一个数字:我们只是不知道是什么数字。Nullity 为未知值提供占位符,而不是为没有值的内容提供占位符。暗物质确实以物体的形式存在,但由于我们没有任何关于它的信息,因此没有关于其类型的进一步信息。
JavaScript 理解这一点。因此,从历史上看,typeof null
一直'object'
,typeof undefined
一直'undefined'
。
有人说这是自 JavaScript 诞生以来的遗留错误;我更愿意说这是 JavaScript 诞生之初的常识。
JavaScript中的一个错误是null === null
和var o = {x:undefined}; 'x' in o; // true
,两者都不应该是这样。
在 MDN 的文档中,这就是他们给出null
对象的原因:
typeof null === 'object'; // This stands since the beginning of JavaScript
是的!这是一个很好的理由...我猜他们自己不明白,因此是设计错误。