我正在对JavaScript的typeof运算符进行一些研究,并偶然发现了以下奇怪之处:
例外
所有当前浏览器都公开
document.all类型为Undefined 的非标准主机对象.Run Code Online (Sandbox Code Playgroud)typeof document.all === 'undefined';虽然规范允许非标准外来对象的自定义类型标记,但它要求那些类型标记与预定义标记不同.
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"吗?
从Html Spec看一下这个
该
all属性必须返回以节点为HTMLAllCollection根 的属性Document,其过滤器与所有元素匹配.返回的对象
all有几个不寻常的行为:
当给定为所有对象返回的对象时,用户代理必须表现为JavaScript中的ToBoolean抽象操作返回false.
当给定返回的对象时,用户代理必须表现为抽象等同比较算法在与和值比较时
all返回.(使用严格等式比较算法进行比较,并将抽象等式与其他值(如字符串或对象)进行比较,不受影响.)trueundefinednull用户代理必须采取行动,使得JavaScript中的typeof运算符在应用于返回的对象时返回字符串"undefined"
all.
第三种情况是你的.
其基本原理是与为旧浏览器设计的代码兼容,如规范中的说明所述:
这种违规行为的动机是希望与两类遗留内容兼容:一种使用存在
document.all作为检测遗留用户代理的方式,另一种仅支持那些遗留用户代理并使用该document.all对象而不首先测试其存在.
希望它对你有意义.
| 归档时间: |
|
| 查看次数: |
1309 次 |
| 最近记录: |