IE8 querySelector null vs normal null

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

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

Ответы

Ответ 1

Итак, Ян Дворжак определенно прав.

В соответствии с этим ответом null - это собственный объект, а querySelector - объект-хост.

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

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

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

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