javascript 为什么undefined是数据类型

t98cgbkg  于 2023-04-04  发布在  Java
关注(0)|答案(3)|浏览(117)

我最近在调试时学到,undefined是一种数据类型,null是一个对象。
我认为它们都属于数据类型。
检查了typeof undefinedtypeof null,分别返回**“undefined”“object”**。

typeof undefined 
"undefined"

typeof null
"object"

有人能解释一下为什么会有这种奇怪的行为吗?

i2loujxw

i2loujxw1#

typeof null作为对象是一个早期的错误-when they tried correcting it in a Chrome nightly (to typeof null === "null" )太多的东西依赖于当前的行为和太多的代码破坏。
未设置为正常值的JavaScript对象通常有三种状态:
1.未申报。
1.未定义。
1.完全没有。

未声明

例如-这种情况:

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.

基本上,未声明的变量处于“脚本不知道此变量”状态。

未定义

这意味着运行时“知道这个变量”,但它还没有被设置为任何值。或者,正如语言规范所说:
undefined value -当变量没有被赋值时使用的原始值。
例如:

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*/})()

显式无

当你有一个 * 应该 * 有一个值的东西,但你想声明它什么都不是。或者,正如语言规范所说:
空值-表示有意缺少任何对象值的基元值。
例如,如果给定ID的元素不在DOM中,则document.getElementById("foo");返回null,以指示 * 显式地没有返回任何内容 *。将此与没有return语句的函数进行对比,使其返回默认值undefined

yi0zb3m4

yi0zb3m42#

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

正如this answer所说:
undefined是缺少类型和值,null是缺少值。
但我更喜欢用一个现实世界的类比:暗物质(dark matter)
undefined就像不存在的物质。它没有形式或实质,因此没有有意义的类型。当某个东西不应该被认为存在时,您将其设置为undefined
另一方面,在计算机科学领域,null描述了一个未知状态的对象。它仍然是一个对象,但我们不知道 * 什么 * 对象或它的值是什么。(在这个意义上,它类似于数字NaN,它在概念上仍然是一个数字:我们只是不知道 * 什么 * 数字。)**Nullity为未知值提供占位符,而不是没有值的东西。*它是暗物质, 确实 * 存在,以 * 对象 * 的形式,但没有关于其类型的进一步信息,因为我们没有任何关于它的信息。
JavaScript理解这一点。因此,历史上,typeof null一直是'object'typeof undefined一直是'undefined'
Some people say this is a legacy bug自JavaScript诞生以来;我更愿意说这是JavaScript诞生之初的常识。
JavaScript中的一个bug是null === nullvar o = {x:undefined}; 'x' in o; // true,这两个都不应该是这种情况。

h6my8fg2

h6my8fg23#

documentation on MDN中,这是他们给予的null是对象的原因:

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

耶!这是一个很好的理由……我想他们自己也不理解,因此是一个设计错误。

相关问题