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 和未定义之间有什么区别?