为什么未定义是一种数据类型



我最近在调试时了解到,undefined是一种数据类型,null是一个对象。

我认为它们都属于数据类型。

我检查了未定义的类型和空的类型。它们分别返回"未定义">"对象"。

typeof undefined 
"undefined"
typeof null
"object"

有人可以解释为什么这种奇怪的行为吗?

typeof null

成为对象是一个早期的错误 - 当他们尝试每晚在Chrome中更正它时(typeof null === "null"),太多的东西依赖于当前的行为,太多的代码被破坏了。

未设置为正常值的 JavaScript 对象通常具有三种状态:

  1. 未申报的。
  2. 定义。
  3. 明确没有。

未申报的

例如 - 这种情况:

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

它们具有不同的类型,原因与它们存在的原因相同:undefinednull在概念上不是一回事。

正如这个答案所说:

未定义表示缺少类型和值,null 表示缺少值。

但我更喜欢应用现实世界的类比:物质暗物质。

undefined就像不存在的物质。它没有形式或实质,因此没有有意义的类型。你设置了一些东西来undefined当它不应该被视为存在时。

另一方面,null,在计算机科学领域,描述了一个未知状态的对象。它仍然是一个对象,但我们不知道是什么对象或它的价值是什么。(从这个意义上说,它类似于数字NaN在概念上仍然是一个数字:我们只是不知道是什么数字。Nullity 为未知值提供占位符,而不是为没有值的内容提供占位符。暗物质确实物体的形式存在,但由于我们没有任何关于它的信息,因此没有关于其类型的进一步信息。

JavaScript 理解这一点。因此,从历史上看,typeof null一直'object'typeof undefined一直'undefined'

有人说这是自 JavaScript 诞生以来的遗留错误;我更愿意说这是 JavaScript 诞生之初的常识。

JavaScript中的一个错误是null === nullvar o = {x:undefined}; 'x' in o; // true,两者都不应该是这样。

在 MDN 的文档中,这就是他们给出null对象的原因:

typeof null === 'object'; // This stands since the beginning of JavaScript

是的!这是一个很好的理由...我猜他们自己不明白,因此是设计错误。

相关内容

  • 没有找到相关文章