最近我在调试代码时发现 undefined 是一种数据类型,而 null 是一个对象。
我认为它们都属于数据类型。
我检查了 typeof undefined 和 typeof null。它们分别返回 "undefined" 和 "object"。
typeof undefined
"undefined"
typeof null
"object"
能有人解释一下这种奇怪的行为吗。
最近我在调试代码时发现 undefined 是一种数据类型,而 null 是一个对象。
我认为它们都属于数据类型。
我检查了 typeof undefined 和 typeof null。它们分别返回 "undefined" 和 "object"。
typeof undefined
"undefined"
typeof null
"object"
能有人解释一下这种奇怪的行为吗。
null
的 typeof
为 object 是一个早期的错误 - 当他们试图在 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*/})()
当你有一个本应该有值的东西,但你想声明它是空的时候,就可以使用明确的空值。或者,正如语言规范所说:
空值 - 表示任何对象值故意缺失的原始值。
例如,如果给定ID的元素不在DOM中,则document.getElementById("foo");
返回null
,表示明确地返回了空值。与没有返回语句的函数不同,它们返回默认值undefined
。
undefined
和null
在概念上并不相同。正如this answer所说的那样: undefined
是缺乏类型和值,而null
则是缺乏值。但我更喜欢应用一个现实世界的比喻:物质与暗物质。 undefined
就像不存在的物质。它没有形式或实质,因此没有有意义的类型。当某个东西不应被视为存在时,您可以将其设置为undefined
。
null
,另一方面,在计算机科学领域中描述了一个未知状态的对象。它仍然是一个对象,但我们不知道这个对象或其值是什么。(在这个意义上,它类似于数字NaN
,它仍然是一个概念上的数字:我们只是不知道是什么数字。)Nullity用作未知值的占位符,而不是没有值的东西。它是存在的暗物质,以对象的形式存在,但由于我们没有任何关于它的类型的信息,因此没有更多的信息可用。null
的typeof
是'object'
,undefined
的typeof
是'undefined'
。
有些人说这是一个遗留的错误自JavaScript诞生以来;我更喜欢说这是JavaScript诞生时的常识。null === null
和 var o = {x:undefined}; 'x' in o; // true
,这两种情况都不应该出现。null !== null
会是一个非常有趣的实验,除了maybeNull === null
之外,在高层次的角度上,null === null
几乎没有任何意义。还要注意的是,例如o = {x:undefined}
意味着'x' in o; // true
但'y' in o; // false
。 - Benjamin Gruenbaumnull
被视为对象的原因:typeof null === 'object'; // This stands since the beginning of JavaScript
是啊!这是一个好理由... 我猜他们自己也不理解,因此是设计错误。
null
创建一个新类型,当它已经完全适合类型系统时,这将是一个倒退的步骤。 - Lightness Races in Orbit