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*/})()
3条答案
按热度按时间i2loujxw1#
typeof null
作为对象是一个早期的错误-when they tried correcting it in a Chrome nightly (totypeof null === "null"
)太多的东西依赖于当前的行为和太多的代码破坏。未设置为正常值的JavaScript对象通常有三种状态:
1.未申报。
1.未定义。
1.完全没有。
未声明
例如-这种情况:
基本上,未声明的变量处于“脚本不知道此变量”状态。
未定义
这意味着运行时“知道这个变量”,但它还没有被设置为任何值。或者,正如语言规范所说:
undefined value -当变量没有被赋值时使用的原始值。
例如:
显式无
当你有一个 * 应该 * 有一个值的东西,但你想声明它什么都不是。或者,正如语言规范所说:
空值-表示有意缺少任何对象值的基元值。
例如,如果给定ID的元素不在DOM中,则
document.getElementById("foo");
返回null
,以指示 * 显式地没有返回任何内容 *。将此与没有return语句的函数进行对比,使其返回默认值undefined
。yi0zb3m42#
它们有不同的类型,因为它们都存在的原因相同:
undefined
和null
在概念上不是一回事。正如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 === null
和var o = {x:undefined}; 'x' in o; // true
,这两个都不应该是这种情况。h6my8fg23#
在documentation on MDN中,这是他们给予的
null
是对象的原因:耶!这是一个很好的理由……我想他们自己也不理解,因此是一个设计错误。