我正在阅读'Web开发人员的专业Javascript'第4章,它告诉我五种类型的原语是:undefined,null,boolean,number和string。
如果null
是基元,为什么typeof(null)
会返回"object"
?
这是不是意味着null
通过引用传递(我假设所有对象都通过引用传递),因此它不是原始的?
答案 0 :(得分:186)
在JavaScript的第一个实现中,JavaScript值表示为类型标记和值,对象的类型标记为0
,null
表示为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"
?
11.4.3
typeof
运营商生产 UnaryExpression :
typeof
UnaryExpression 评估如下:
- 让 val 成为评估 UnaryExpression 的结果。
- 如果Type( val )为Reference,则为 一个。如果IsUnresolvableReference( val )为 true ,请返回“
undefined
”。
湾让 val 为GetValue( val )。- 根据表20返回由Type( val )确定的字符串。
醇>
答案 2 :(得分:21)
正如已经指出的那样,规范说明了这一点。但是由于JavaScript的实现早于ECMAScript规范的编写,并且规范小心不能纠正初始实现的缺陷,所以仍然存在一个合理的问题,即为什么它首先以这种方式完成。道格拉斯·克罗克福德calls it a mistake。 Kiro风险thinks it kinda sorta makes sense:
这背后的原因是
null
与undefined
形成鲜明对比,经常在对象出现的地方使用。换句话说,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)
对于那些对某些代码感兴趣的人,这是您的链接...。