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

10

Естьэтот твит в твиттере:

In JavaScript, all objects are truthy (as per the spec). In the DOM, there’s one exception to this rule. What is it? #jsquiz #fronttrends

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

Ваш Ответ

4   ответа
1

этоdocument.all.

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

Ваш тестовый документ document.getElementsByTagName не document.all
Из этой скрипки не похоже, чтоjsfiddle.net/V8GaH Nicola Peluchetti
Вы, конечно, проверяете не ту вещь?jsfiddle.net/CPVAf/1
1

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

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
Я боюсь, что ваша методика тестирования неверна. Например, вы пропускаете проверку на ненулевые значения. Помните, что мы говорим только об объектах, которые не являются примитивами (поэтому все объекты, которые не являются логическими значениями, числом, строкой,undefined, или жеnull). Также обратите внимание, чтоtypeof document.all == 'undefined' несмотря на то, что это объект, ваш тест не обнаружит его.
8

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

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

Спецификация ECMAScriptопределяетToBoolean() as follows:

ToBoolean(condition), slide from my Front-Trends 2012 talk

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

The all attribute must return an HTMLAllCollection rooted at the Document node, whose filter matches all elements.

The object returned for all has several unusual behaviors:

The user agent must act as if the ToBoolean() operator in JavaScript converts the object returned for all to the false value.

The user agent must act as if, for the purposes of the == and != operators in JavaScript, the object returned for all is equal to the undefined value.

The user agent must act such that the typeof operator in JavaScript returns the string 'undefined' when applied to the object returned for all.

These requirements are a willful violation of the JavaScript specification current at the time of writing (ECMAScript edition 5). The JavaScript specification requires that the ToBoolean() operator convert all objects to the true value, and does not have provisions for objects acting as if they were undefined for the purposes of certain operators. This violation is motivated by a desire for compatibility with two classes of legacy content: one that uses the presence of document.all as a way to detect legacy user agents, and one that only supports those legacy user agents and uses the document.all object without testing for its presence first.

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

0

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

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

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

Не беспокойтесь, извините за путаницу! Это хитрые вещи.
Ах, да нет, мой плохой, меня выбросили с документом. Все комментарии, но я понимаю, что вы имеете в виду, это так очевидно.
Ваш тест возвращает некоторыеnull значения, которые являются примитивными значениями. Увидетьdocument.nextSibling, например. Мы ищем только те объекты, которые не являются примитивами.
Мой тест обнаруживает, что это в списке. Мой код заботится о ненулевом значении, вот почему есть 2! и не один, первый вернет true, если значение не определено, false или null, а второй вернет false. если бы он не был в списке, сгенерированном демонстрационной программой jsfiddle ....
Я боюсь, что ваша методика тестирования неверна. Например, вы пропустили проверку на отсутствиеnull ценности. Помните, что мы говорим только об объектах, которые не являются примитивами (поэтому все объекты, которые не являются логическими значениями, числом, строкой,undefined, или жеnull).

Похожие вопросы