Я только что обнаружил действительно интересное поведение в 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;

У кого-нибудь есть объяснение этому?

15
Martin Velinsky 10 Сен 2013 в 18:43
5
Он выглядит как хост-объект (хост-объекты не обязаны вести себя каким-либо образом), который претендует на нулевое значение.
 – 
John Dvorak
10 Сен 2013 в 18:46
Я не мог воспроизвести такое поведение. Режим браузера Win7 / IE10 / IE8 / режим документа IE8 / пустая страница. Нужен ли мне настоящий IE8?
 – 
John Dvorak
10 Сен 2013 в 18:49
Я только наблюдаю за правильным поведением. Это полный тестовый пример, который вы используете? Включите запись звонков, пожалуйста
 – 
John Dvorak
10 Сен 2013 в 18:57
1
Да, нужен настоящий IE8.
 – 
Martin Velinsky
10 Сен 2013 в 18:58
Это полный код, который вызовет ошибку в реальном браузере IE8. Я только что протестировал его под ie10 в режиме ie8 и получил правильное поведение.
 – 
Martin Velinsky
10 Сен 2013 в 19:01

1 ответ

Лучший ответ

Так что Ян Дворжак определенно прав.

Согласно этому ответу, null - это собственный объект, а querySelector - объект хоста.

Поведение хост-объекта недостаточно четко определено в спецификации ECMA , поэтому его поведение зависит от реализации, а IE8 и IE10 имеют разные реализации JScript, поэтому даже в «режиме IE8» механизм JavaScript в IE10 обрабатывает объекты по-разному (и лучше). Похоже, что этот конкретный хост-объект в этой конкретной реализации будет нарушать раздел 4.3.8, требуя, чтобы он prototype был null или Object, поскольку он, похоже, не унаследовал свой instanceOf значение.

Похоже, это ошибка в реализации JScript в IE8 (! == ECMAScript || JavaScript), которая была исправлена, когда они переключились на Механизм чакры.

При всем при этом, если вам будет больно, когда вы это сделаете, не делайте этого. Просто проверьте, есть ли document.querySelector() === null.

Надеюсь, что это проливает свет на это. Для получения дополнительной информации см. Связанный ответ, они отлично объяснили.

6
Community 23 Май 2017 в 14:51