Ответ 1
Отказ от ответственности: Я тот парень, который чирикал::) Это был вопрос, который я задавал бы и отвечал бы в своем Front-Trends. Я написал этот твит за 5 минут до выхода на сцену.
Из-за ограничения на 140 символов в Twitter, вопрос немного неоднозначен. Реальный вопрос, который я задавал, заключается в следующем.
Спецификация ECMAScript определяет ToBoolean()
следующим образом:
Как вы можете видеть, все непримитивные объекты (т.е. все объекты, которые являются логическими, число, строка, undefined
или null
), являются правдивыми по спецификации. Однако в DOM есть одно исключение - объект DOM, который является ложным. Вы знаете, какой из них?
Ответ: document.all
. Спецификация HTML говорит:
Атрибут
all
должен вернутьHTMLAllCollection
, внедренный вDocument
node, фильтр которого соответствует всем элементам.Объект, возвращенный для всех, имеет несколько необычных типов поведения:
Пользовательский агент должен действовать так, как если бы оператор
ToBoolean()
в JavaScript преобразует возвращаемый объект дляall
в значениеfalse
.Пользовательский агент должен действовать так, как будто для
==
и!=
операторов в JavaScript, объект, возвращаемый дляall
, равенundefined
.Пользовательский агент должен действовать так, что оператор
typeof
в JavaScript возвращает строку'undefined'
при применении к возвращенному объектуall
.Эти требования являются преднамеренным нарушением JavaScript спецификация тока на момент написания (ECMAScript edition 5). Спецификация JavaScript требует, чтобы оператор
ToBoolean()
конвертировать все объекты в значениеtrue
и не имеет положений для объектов, действующих, как если бы они былиundefined
для целей некоторые операторы. Это нарушение мотивировано желанием совместимость с двумя классами устаревшего контента: тот, который использует наличиеdocument.all
в качестве способа обнаружения устаревших пользовательских агентов и который поддерживает только те устаревшие пользовательские агенты и используетdocument.all
объект без тестирования для его присутствия в первую очередь.
Итак, document.all
является единственным официальным исключением из этого правила ECMAScript. (В Opera, document.attachEvent
и т.д. Тоже ложны, но это нигде не указано.)