为什么typeof null“对象”?

时间:2013-09-15 02:02:55

标签: javascript primitive

我正在阅读'Web开发人员的专业Javascript'第4章,它告诉我五种类型的原语是:undefined,null,boolean,number和string。

如果null是基元,为什么typeof(null)会返回"object"

这是不是意味着null通过引用传递(我假设所有对象都通过引用传递),因此它不是原始的?

8 个答案:

答案 0 :(得分:186)

在JavaScript的第一个实现中,JavaScript值表示为类型标记和值,对象的类型标记为0null表示为NULL指针(大多数平台上的0x00)。因此,null为0作为类型标记,因此虚假typeof返回值(reference)。

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

为ECMAScript提出了“修复”(通过选择加入)。它会导致:

typeof null === 'null'

...但此更改为rejected,原因是代码使用此特定“quirk”来测试null

答案 1 :(得分:62)

  

如果null是基元,为什么typeof(null)会返回"object"

因为the spec says so

  

11.4.3 typeof运营商

     

生产 UnaryExpression typeof UnaryExpression 评估如下:

     
      
  1. val 成为评估 UnaryExpression 的结果。
  2.   
  3. 如果Type val )为Reference,则为   一个。如果IsUnresolvableReference val )为 true ,请返回“ undefined ”。
      湾让 val GetValue val )。
  4.   
  5. 根据表20返回由Type val )确定的字符串。
  6.         

    enter image description here

答案 2 :(得分:21)

正如已经指出的那样,规范说明了这一点。但是由于JavaScript的实现早于ECMAScript规范的编写,并且规范小心不能纠正初始实现的缺陷,所以仍然存在一个合理的问题,即为什么它首先以这种方式完成。道格拉斯·克罗克福德calls it a mistake。 Kiro风险thinks it kinda sorta makes sense

  

这背后的原因是nullundefined形成鲜明对比,经常在对象出现的地方使用。换句话说,null通常用于表示对象的空引用。当Brendan Eich创建JavaScript时,他遵循相同的范例,并且(可以说)返回“对象”是有道理的。实际上,ECMAScript规范将null定义为表示故意缺少任何对象值的原始值(ECMA-262,11.4.11)。

答案 3 :(得分:5)

从书YDKJS

  

这是JS中一个长期存在的错误,但可能永远不会发生   等待修复。 Web上的代码过多依赖于bug,因而也是如此   修复它会导致更多的错误!

答案 4 :(得分:4)

  

如果 <?php $array = array( 'fruit1' => 'apple', 'fruit2' => 'orange', 'fruit3' => ' ', 'fruit4' => ' ', 'fruit5' => 'apple'); for ($i = 0; $i < count($array); $i++) { $key=key($array); $val=$array[$key]; if ($val<> ' ') { echo $key ." = ". $val ." <br> "; } next($array); } /* fruit1 = apple fruit2 = orange fruit5 = apple */ ?> 是基元,为什么null会返回“typeof(null)”?

简而言之:它是ECMAScript中的错误,类型应为object

参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null

答案 5 :(得分:1)

在JavaScript中,null为“ nothing”。它应该是不存在的东西。不幸的是,在JavaScript中,null的数据类型是一个对象。您可以认为typeof null是对象是JavaScript中的错误。它应该为空。

答案 6 :(得分:0)

在JavaScript中,typeof null为'object',错误地表明null为对象。这是一个错误,很遗憾无法修复,因为它会破坏现有代码。

答案 7 :(得分:-1)

对于那些对某些代码感兴趣的人,这是您的链接...。

why typeof null is object with the implementation