15

我刚刚在 ie8 中发现了非常有趣的行为。事实证明,null 并不总是 null。

// just normal, casual null hanging out in the sun
var nullA = null;
// query for non existing element, should get null, same behaviour also for getElementById
var nullB = document.querySelector('asdfasfdf');

// they are equal
console.log(nullA === nullB);

// false
nullA instanceof Object;

// will throw 'Object expected' error in ie8. Black magic
nullB instanceof Object;

有人对此有解释吗?

4

1 回答 1

6

所以,扬·德沃夏克绝对是对的。

根据这个答案null是一个原生对象并且querySelector是一个宿主对象。

宿主对象的行为在ECMA 规范中没有很好的定义,所以它的行为取决于实现,而 IE8 和 IE10 有不同的 JScript 实现,这就是为什么即使在“IE8 模式”下,IE10 中的 JavaScript 引擎对对象的处理方式也不同(更好)。在这个特定的实现中,这个特定的宿主对象似乎违反了第 4.3.8 节要求它prototype必须继承nullObject似乎没有继承其instanceOf值的规定。

这似乎是 JScript (!== ECMAScript || JavaScript) 的 IE8 实现中的一个错误,当他们切换到Chakra 引擎时已修复。

话虽如此,如果你这样做时会感到疼痛,那就不要那样做。只是检查看看是否document.querySelector() === null

希望能对此有所了解。有关更多信息,请参阅链接的答案,他们做了很好的解释。

于 2013-09-13T18:34:45.567 回答