为什么document.all定义但typeof document.all返回"undefined"?

Nis*_*ssa 7 javascript dom

我正在对JavaScript的typeof运算符进行一些研究,并偶然发现了以下奇怪之处:

例外

所有当前浏览器都公开document.all类型为Undefined 的非标准主机对象.

typeof document.all === 'undefined';
Run Code Online (Sandbox Code Playgroud)

虽然规范允许非标准外来对象的自定义类型标记,但它要求那些类型标记与预定义标记不同.document.all具有类型标签的情况'undefined'必须归类为违反规则的例外情况.

(来源)

我在浏览器中设置了以下内容来测试它:

console.log("typeof: " + typeof document.all);
console.log("toString: " + document.all);
Run Code Online (Sandbox Code Playgroud)

它产生了:

typeof: undefined
toString: [object HTMLAllCollection]
Run Code Online (Sandbox Code Playgroud)

那么为什么会document.all这样呢?既然document.all是一个对象(在我的浏览器中定义),不应该typeof返回"object",不是"undefined"吗?

The*_*son 7

Html Spec看一下这个

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

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

  1. 当给定为所有对象返回的对象时,用户代理必须表现为JavaScript中的ToBoolean抽象操作返回false.

  2. 当给定返回的对象时,用户代理必须表现为抽象等同比较算法在与和值比较时all返回.(使用严格等式比较算法进行比较,并将抽象等式与其他值(如字符串或对象)进行比较,不受影响.)trueundefinednull

  3. 用户代理必须采取行动,使得JavaScript中的typeof运算符在应用于返回的对象时返回字符串"undefined" all.

第三种情况是你的.

其基本原理是与为旧浏览器设计的代码兼容,如规范中的说明所述:

这种违规行为的动机是希望与两类遗留内容兼容:一种使用存在document.all作为检测遗留用户代理的方式,另一种仅支持那些遗留用户代理并使用该document.all对象而不首先测试其存在.

希望它对你有意义.

  • @StephenLeppik您是否按照链接进行了操作?有一个很大的绿色**Note**解释了原因. (4认同)