Javascript混淆null,instanceof和typeof的语法不一致?

时间:2015-03-10 04:13:47

标签: javascript oop object null

var obj = {};
typeof obj; // returns "object"
obj instanceof Object // return true

typeof null // returns "object"
null instanceof Object // returns false

怎么样

typeof undefined // return "undefined"
undefined instanceof undefined 
// ERROR:  Uncaught TypeError: Expecting a function in instanceof check, 
//         but got undefined

为什么会这样?我已经阅读了很多关于SO的相关主题,但仍然无法得到这个。

理解'typeof'会返回一个String,所以它几乎反映了Javascript中的规则。(例如null是一个对象......好吧..)但是为什么“null instanceof Object”返回false?

“x instanceof y”

是否意味着'x'必须由'y'构造函数创建?对于null,情况并非如此?

修改

如果您能解释其背后的语法和返回值之外的实例和类型的不同意图,我们将非常感激。

null和undefined

之间的区别
typeof null        // object (bug in ECMAScript, should be null)
typeof undefined   // undefined
null === undefined // false
null  == undefined // true

REF

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof

3 个答案:

答案 0 :(得分:3)

这只是设计决定,可能是人为的或奇怪的。根据{{​​1}} UnaryExpression ,如果按以下方式评估。我只是把重点包括在内。

  

ECMA Spec:   根据表20返回由Type(val)确定的字符串。

typeof

所以,我们无能为力。它是。但返回Table 20: ╔═════════════╦══════════╗ ║ Type of val ║ Result ║ ╠═════════════╬══════════╣ ║ null ║ "object" ║ ╚═════════════╩══════════╝ 是正确的,因为false有一个名为Null type的单独类型

  

null   唯一值为空值的类型

显然,

Null type:并不是Object的一个实例,因为它已经拥有了自己的类型。只是null运算符返回typeof。它与javascript的设计有关。

为什么会这样?将不得不问Brendan Eich(Javascript的创始人)。

答案 1 :(得分:0)

这是ECMAScript的常见错误。

null不是object,它是一个原始值。(所以你不能修改它就像添加属性一样)

typeof null应该返回null

  

typeof null // object(ECMAScript中的错误,应为null)

     

typeof undefined // undefined

     

null === undefined // false

     

null == undefined // true

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

<强> EDITED

无法看到

  

3周前由brendan改变

     

你知道,这一切都是因为   在1995年5月初匆忙,导致类型标签泄漏   由null和对象类型共享的表示。但是null意味着&#34;不   对象&#34;,所以它没有引起骚动,直到修复为时已晚   Netscape 2,之后我们不愿意&#34;修复&#34;它和&#34;打破了   幅&#34 ;.这个论点现在只适用于网络人口的程度。   我们还有其他鱼类可以炒。这个已经被吞噬了。   让我们不要改变ES4的typeof null并处理更重要的问题。

http://web.archive.org/web/20071110193102/http://bugs.ecmascript.org/ticket/250

也请查看此答案

Why is null an object and what's the difference between null and undefined?

答案 2 :(得分:0)

instanceof更有吸引力,但是您检查了instaceof undefined抛出异常,因为undefined不是任何单一类型的对象名称,它可能是也可能不是 sub method JavaScript Object。因为undefined类型为 null (空类型)。

typeof undefined // return "undefined"
undefined instanceof Object // return False 

你应该检查undefined是instaceof JS对象,给它一个不是它不是对象。它会提供 boolean 结果。