Javascript 为什么typeof为null;对象";?

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的计

我正在阅读《面向Web开发人员的专业Javascript》第4章,它告诉我五种类型的原语是:未定义、null、boolean、number和string

如果
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值表示为一个类型标记和一个值。对象的类型标记为0
    null
    表示为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)@peter
    typeof
    没有告诉你是否可以调用某个对象的方法。据我所知,除了
    null
    undefined
    之外,你可以调用任何对象的方法。peter你不能调用字符串基元的方法,但感谢的是字符串基元(以及数字基元和布尔基元)当您将其中一个原语与属性引用运算符(
    []
    )一起使用时,将在字符串、数字和布尔包装中隐式自动“自动装箱”。不要相信所有内容都写在书中。我真的很喜欢那本书,但是我不能考虑。 // This stands since the beginning of JavaScript typeof null === 'object';