JavaScript中的所有对象都符合规范,但在DOM中,一个非原始对象不是.哪一个?

Nic*_*tti 10 javascript dom object

Twitter上这条推文:

在JavaScript中,所有对象都是真实的(根据规范).在DOM中,此规则有一个例外.它是什么?#jsquiz #fronttrends

有人知道答案吗?

Mat*_*ens 9

免责声明: 我是那个发推文的人:)这是我在前线趋势谈话中要求和回答的问题.我在上台前5分钟写了推文.


由于Twitter上有140个字符的限制,这个问题有点含糊不清.我问的真正问题如下.

ECMAScript规范定义ToBoolean()如下:

ToBoolean(条件),从我的Front-Trends 2012演讲中滑出

正如您所看到的,所有非基本对象(即所有不是布尔值,数字,字符串undefined或对象的对象null)都符合规范.但是,在DOM中,有一个例外 - 一个虚假的DOM对象.你知道那是哪一个吗?答案是document.all.HTML规范说:

all属性必须返回以节点为HTMLAllCollection根的属性Document,其过滤器与所有元素匹配.

为所有人返回的对象有几个不寻常的行为:

用户代理必须采取行动,就好像ToBoolean()在JavaScript操作转换为返回的对象allfalse值.

对于 JavaScript 中的==!=运算符,用户代理必须表现为返回的对象all等于该 undefined值.

用户代理必须采取行动,以便typeofJavaScript 中的运算符在'undefined'应用于返回的对象时 返回该字符串all.

这些要求是在撰写本文时故意违反JavaScript规范(ECMAScript第5版).JavaScript规范要求ToBoolean()运算符将所有对象转换为true值,并且没有为对象提供的操作,就好像它们是undefined出于某些运算符的目的一样.这种违规行为的动机是希望与两类遗留内容兼容:一种使用存在document.all作为检测遗留用户代理的方式,另一种仅支持那些遗留用户代理并使用该 document.all对象而不首先测试其存在.

因此,document.all这是ECMAScript规则的唯一官方例外.(在Opera document.attachEvent等中也是假的,但在任何地方都没有.)