我最近在调试时学到了,undefined是一种数据类型,null是一个对象。
我认为它们都属于数据类型。
我检查了 typeof undefined 和 typeof null 。他们分别返回“undefined”和“object”。
typeof undefined
"undefined"
typeof null
"object"
有些机构可以解释为什么这种奇怪的行为。
答案 0 :(得分:4)
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 value - 表示故意缺少任何对象值的原始值。
例如,document.getElementById("foo");
返回null
如果具有给定ID的元素不在DOM中,则表示明确没有返回。使用没有return语句的函数对此进行约束,因此返回undefined
这是默认值。
答案 1 :(得分:2)
他们有不同的类型,因为他们两者存在的原因相同:undefined
和null
在概念上并不相同。
正如this answer所说:
undefined是缺少类型和值,null是缺少值。
但我更喜欢应用现实世界的比喻:物质 vs 暗物质。
undefined
就像不存在的事物。它没有任何形式或实质,因此没有任何有意义的类型。当事情不应被视为存在时,您将某事设置为undefined
。
null
正好在计算机科学领域,描述了一个未知状态的对象。它仍然是一个对象,但我们不知道是什么对象或它的价值是什么。 (在这个意义上它类似于数字NaN
,它在概念上仍然是一个数字:我们只是不知道是什么数字。) Nullity为一个未知值的占位符服务,不是没有价值的东西。 存在的暗物质,以对象的形式存在,但没有关于其类型的更多信息可用因为我们没有任何相关信息。
JavaScript理解这一点。因此,从历史上看,typeof null
已'object'
而typeof undefined
已为'undefined'
。
JavaScript中的一个错误是null === null
和var o = {x:undefined}; 'x' in o; // true
,这两者都不应该是这种情况。
答案 2 :(得分:0)
在documentation on MDN这就是他们为null
作为对象的原因:
typeof null === 'object'; // This stands since the beginning of JavaScript
呀!这是一个很好的理由......我猜他们自己并不理解,因此设计错误。