Javascript 混淆了 null、instanceof 和 typeof 的语法不一致


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"会返回一个字符串,所以它几乎反映了Javascript中的规则。(例如,null 是一个对象...好吧..)但是为什么"对象的空实例"返回 false ?

"x 实例 y"

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

编辑

如果您能解释实例和类型背后的不同意图,而不是语法和返回值,将不胜感激。

空值和未定义值之间的区别

typeof null        // object (bug in ECMAScript, should be null)
typeof undefined   // undefined
null === undefined // false
null  == undefined // true

裁判

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

这只是设计决策,可能是人为的或奇怪的。根据typeof 如果计算为以下内容,则为一元表达式。我刚刚包括了重要的poin。

ECMA 规范: 返回由表 20 由 Type(val) 确定的字符串。

Table 20:
╔═════════════╦══════════╗
║ Type of val ║  Result  ║
╠═════════════╬══════════╣
║ null        ║ "object" ║
╚═════════════╩══════════╝

所以,我们对此无能为力。这是状态设计。但是返回false是正确的,因为null有一个单独的类型称为Null type

Null type: 唯一值为 null 值的类型

显然,null不是 Object 的实例,因为它有自己的类型。只是typeof运算符返回"object".这与javascript的设计有关。

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

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

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

您应该检查未定义是instaceof JS对象,给出否,它不是对象。它给出了一个boolean的结果。

这是 ECMAScript 的一个常见错误。

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

typeof null应该返回null

typeof null//object (ECMAScript 中的 bug,应该是 null)

类型未定义//未定义

空 === 未定义//假

空 == 未定义//真

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

编辑

虽然无法查看

更改 3 周前 由 布伦丹

你知道,这一切都是因为1995年5月初的匆忙,导致类型标签泄漏由 null 和对象类型共享的表示形式。但 null 表示"不"对象",所以直到修复为时已晚才引起黑客攻击Netscape 2,在那之后我们不愿意"修复"它并"打破网"。这个论点现在只适用于网络人口的程度。我们还有其他鱼要炸。这个已经被吞下了。让我们不要更改 ES4 的 null 类型,而是处理更重要的问题。

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

也检查这个答案

为什么 null 是一个对象,null 和未定义之间有什么区别?

最新更新