Все объекты в JavaScript соответствуют действительности, но в DOM нет одного непримитивного объекта. Который?

В Твиттере есть этот твит:

В JavaScript все объекты правдивы (согласно спецификации). В DOM есть одно исключение из этого правила. Что это? #jsquiz #fronttrends

Кто-нибудь знает ответ?

4 ответа

Решение

Отказ от ответственности: я парень, который написал в Твиттере:) Это был вопрос, который я хотел бы задать и ответить в моем выступлении Front-Trends. Я написал этот твит за 5 минут до выхода на сцену.


Из-за ограничения в 140 символов в Twitter вопрос несколько двусмысленный. Реальный вопрос, который я задавал, заключается в следующем.

Спецификация ECMAScript определяет ToBoolean() следующим образом:

ToBoolean (условие), слайд из моего выступления Front-Trends 2012

Как вы можете видеть, все не примитивные объекты (т.е. все объекты, которые не являются логическими, число, строка, undefined, или же null) правдивы согласно спецификации. Однако в DOM есть одно исключение - ложный объект DOM. Вы знаете, кто это? Ответ document.all, Спецификация HTML гласит:

all атрибут должен возвращать HTMLAllCollection коренится в Document узел, чей фильтр соответствует всем элементам.

Объект, возвращаемый для всех, имеет несколько необычное поведение:

Пользовательский агент должен действовать так, как если бы ToBoolean() Оператор в JavaScript преобразует объект, возвращенный для all к false значение.

Пользовательский агент должен действовать так, как будто для целей == а также != операторы в JavaScript, объект возвращен для all равно undefined значение.

Пользовательский агент должен действовать так, чтобы typeof Оператор в JavaScript возвращает строку 'undefined' применительно к объекту, возвращенному для all,

Эти требования являются преднамеренным нарушением спецификации JavaScript, действующей на момент написания (редакция ECMAScript 5). Спецификация JavaScript требует, чтобы ToBoolean() оператор преобразует все объекты в true стоимость, и не имеет положений для объектов, действующих, как если бы они были undefined для целей определенных операторов. Это нарушение вызвано желанием совместимости с двумя классами устаревшего контента: тот, который использует наличие document.all как способ обнаружить устаревшие пользовательские агенты, и тот, который поддерживает только эти устаревшие пользовательские агенты и использует document.all объект без проверки на его наличие в первую очередь.

Так, document.all является единственным официальным исключением из этого правила ECMAScript. (В опере document.attachEvent и т.д. тоже ложные, но это нигде не видно.)

Хорошо, используя этот код

for (var name in document) {
    if (!!document[name] === false && typeof document[name] === 'object' && document.hasOwnProperty(name)) {
        $('#foo').append('document.' + name + '<br />');        
    };
};​

у меня был этот результат в Chrome (результаты могут отличаться)

document.ownerDocument
document.attributes
document.namespaceURI
document.nextSibling
document.webkitCurrentFullScreenElement
document.nodeValue
document.preferredStylesheetSet
document.textContent
document.previousSibling
document.parentNode
document.xmlVersion
document.parentElement
document.localName
document.selectedStylesheetSet
document.prefix
document.xmlEncoding

Это document.all,

Это нестандартно, так что вам лучше использовать document.getElementsByTagName("*"),

Просто зациклите документ и проверьте все..

http://jsfiddle.net/UTNkW/3/

РЕДАКТИРОВАТЬ: неправильная методология испытаний, к счастью, кто-то указал на это, и я мог бы исправить это.

Другие вопросы по тегам