Javascript 为什么typeof为null;对象";?
我正在阅读《面向Web开发人员的专业Javascript》第4章,它告诉我五种类型的原语是:未定义、null、boolean、number和string 如果Javascript 为什么typeof为null;对象";?,javascript,primitive,Javascript,Primitive,我正在阅读《面向Web开发人员的专业Javascript》第4章,它告诉我五种类型的原语是:未定义、null、boolean、number和string 如果null是原语,为什么typeof(null)返回“object” 这是否意味着null是通过引用传递的(我在这里假设所有对象都是通过引用传递的),因此它不是一个原语 如果null是原语,为什么typeof(null)返回“object” 因为 操作员的类型 生产UnaryExpression:typeofUnaryExpression的计
null
是原语,为什么typeof(null)
返回“object”
这是否意味着null
是通过引用传递的(我在这里假设所有对象都是通过引用传递的),因此它不是一个原语
如果null
是原语,为什么typeof(null)
返回“object”
因为
操作员的类型
生产UnaryExpression:typeof
UnaryExpression的计算如下:
让val作为对一元表达式求值的结果
如果(val)为,则
a。如果(val)为真,则返回“未定义
”
b。让瓦尔成为(瓦尔)
根据表20返回由(val)确定的字符串
发件人:
null
//这一点从JavaScript开始就存在
typeof null==='object';
在JavaScript的第一个实现中,JavaScript值表示为一个类型标记和一个值。对象的类型标记为0null
表示为null指针(在大多数平台中为0x00)。因此,null的type标记为0,因此返回值为“object”typeof
。()
有人建议修复ECMAScript(通过选择加入),但是。这将导致typeof null===“null”
正如已经指出的,规范是这样说的。但是,由于JavaScript的实现早于ECMAScript规范的编写,并且该规范谨慎地没有纠正初始实现的缺点,因此仍然存在一个合理的问题,那就是为什么首先要这样做。道格拉斯·克罗克福德。基罗风险:
这背后的原因是,null
,与未定义的
相反,在对象出现的地方经常使用(现在仍然使用)。换句话说,null
通常用于表示对对象的空引用。当Brendan Eich创建JavaScript时,他遵循了相同的范式,返回“object”是有意义的(可以说)。事实上,ECMAScript规范将null
定义为表示故意不存在任何对象值的原语值(ECMA-262,11.4.11)
如果null
是原语,为什么typeof(null)
返回“object
”
简而言之:它是ECMAScript中的bug,类型应该是null
参考资料:来自本书
这是JS中一个长期存在的bug,但可能永远不会出现
待修复。Web上太多的代码依赖于bug,因此
修复它会导致更多的错误
在JavaScript中,null是“nothing”。它应该是不存在的东西。不幸的是,在JavaScript中,null的数据类型是一个对象。你可以认为它是JavaScript中的一个错误,类型null是一个对象。它应该是null。在JavaScript中,typeof null是“object”,这错误地表明null是一个对象。这是一个错误,不幸的是无法修复,因为它会破坏现有代码。对于那些对导致这种行为的代码感兴趣的人,这是你们的链接
回答:因为说明书上这么说。这通常被认为是一个错误。注意,typeof是一个运算符,而不是一个函数(事实上,您可以省略它后面的括号),因此在这里谈论通过引用传递是没有意义的。《JavaScript:The Good Parts》一书实际上提到了一个事实,即附录A第A.6节中题为“可怕的部分”的typeof null===“object”。我想我想读一下“可怕的部分”,这是一个巨大的错误,深不可测!)那么,我们应该用什么来代替typeof来检查变量所持有的值的类型呢?我很想知道它们之间是什么(布尔、字符串、数字、数组、对象、函数、符号、null、未定义、NaN),因为我现在找不到视频,我将发布这篇文章,仅供好奇的人参考,没有任何参考:Crockford解释了解析null类型时的零值如何指向类型数组上的零索引元素,因此,这是一个明显的开发缺陷,微软的家伙在为他们的浏览器反编译和重新编译JS时意外传播了这一缺陷。遗憾的是,这一更改至少没有进入严格模式……人们一直在利用这一怪癖,如果不拒绝,许多代码将不得不更改,我想,对于少数希望通过这种方式来改变代码的活着的人来说,这比其他开发人员在剩下的时间里必须学习它更有意义。仅仅因为一个人还不存在,并不一定意味着他们不重要,只是意味着他们没有防御能力。这不理解为什么人们会用它作为空检查。它没有直观的意义,那么他们为什么要使用它呢?现在,由于编码错误,无法添加更改。在您的参考中,没有任何地方说明这是一个bug。在规范中,也没有任何地方说明typeof应返回除“未定义”、“对象”、“布尔”、“数字”、“字符串”、“函数”和“符号”之外的任何内容(ECMAScript 2015)@petertypeof
没有告诉你是否可以调用某个对象的方法。据我所知,除了null
和undefined
之外,你可以调用任何对象的方法。peter你不能调用字符串基元的方法,但感谢的是字符串基元(以及数字基元和布尔基元)当您将其中一个原语与属性引用运算符(
或[]
)一起使用时,将在字符串、数字和布尔包装中隐式自动“自动装箱”。不要相信所有内容都写在书中。我真的很喜欢那本书,但是我不能考虑。
// This stands since the beginning of JavaScript
typeof null === 'object';