为什么undefined是一种数据类型

时间:2014-02-13 13:01:21

标签: javascript null undefined

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

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

我检查了 typeof undefined typeof null 。他们分别返回“undefined”“object”

typeof undefined 
"undefined"

typeof null
"object"

有些机构可以解释为什么这种奇怪的行为。

3 个答案:

答案 0 :(得分:4)

typeof null作为对象是一个早期的错误 - 当他们尝试在Chrome中每晚修改它(到typeof null === "null")时,太多的东西依赖于当前行为并且代码损坏了太多。

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

  1. 未声明。
  2. 未定义。
  3. 明确没什么。
  4. 未声明

    例如 - 这种情况:

     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)

他们有不同的类型,因为他们两者存在的原因相同:undefinednull在概念上并不相同。

正如this answer所说:

  

undefined是缺少类型和值,null是缺少值。

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

undefined就像不存在的事物。它没有任何形式或实质,因此没有任何有意义的类型。当事情不应被视为存在时,您将某事设置为undefined

另一方面,

null正好在计算机科学领域,描述了一个未知状态的对象。它仍然是一个对象,但我们不知道是什么对象或它的价值是什么。 (在这个意义上它类似于数字NaN,它在概念上仍然是一个数字:我们只是不知道是什么数字。) Nullity为一个未知值的占位符服务,不是没有价值的东西。 存在的暗物质,以对象的形式存在,但没有关于其类型的更多信息可用因为我们没有任何相关信息。

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

自JavaScript诞生以来,{p> Some people say this is a legacy bug;我更喜欢说从JavaScript开始就是常识。

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

答案 2 :(得分:0)

documentation on MDN这就是他们为null作为对象的原因:

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

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