Я только что обнаружил действительно интересное поведение в ie8. Оказывается, 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;
У кого-нибудь есть объяснение этому?
1 ответ
Так что Ян Дворжак определенно прав.
Согласно этому ответу, null
- это собственный объект, а querySelector
- объект хоста.
Поведение хост-объекта недостаточно четко определено в спецификации ECMA a>, поэтому его поведение зависит от реализации, а IE8 и IE10 имеют разные реализации JScript, поэтому даже в «режиме IE8» механизм JavaScript в IE10 обрабатывает объекты по-разному (и лучше). Похоже, что этот конкретный хост-объект в этой конкретной реализации будет нарушать раздел 4.3.8, требуя, чтобы он prototype
был null
или Object
, поскольку он, похоже, не унаследовал свой instanceOf
значение.
Похоже, это ошибка в реализации JScript в IE8 (! == ECMAScript || JavaScript), которая была исправлена, когда они переключились на Механизм чакры.
При всем при этом, если вам будет больно, когда вы это сделаете, не делайте этого. Просто проверьте, есть ли document.querySelector() === null
.
Надеюсь, что это проливает свет на это. Для получения дополнительной информации см. Связанный ответ, они отлично объяснили.
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Имейте в виду, что JavaScript — это НЕ то же самое, что Java! Включите все ярлыки, относящиеся к вашему вопросу; например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [svelte] и т. д.