document.all是IE专有历史遗留属性,在IE中布尔值为true,现代浏览器中均为false,虽被保留以兼容旧网页,但非标准、不可instanceof、无构造函数,仅布尔检测if(document.all)可可靠识别IE。

document.all 是一个历史遗留的 IE 专有属性,它在布尔上下文中表现特殊:在 IE 浏览器中为 true,而在所有现代浏览器(包括 Edge、Chrome、Firefox、Safari)中均为 false,哪怕这些浏览器实际支持 document.all 的取元素能力。这种“假对象+真布尔值”的组合,正是它被用作 IE 检测依据的核心原因。
为什么说它是“假”对象?
它不是标准 DOM 接口,也不符合 Web IDL 规范;没有构造函数、不可 instanceof、不能被 Object.prototype.toString 正确识别。它的存在纯粹是 IE 4–11 的实现产物。现代浏览器虽保留该属性(出于兼容考虑),但刻意将其布尔转换结果设为 false,以区分真实 IE 环境。
如何可靠检测它的布尔行为?
直接使用布尔上下文判断是最简洁有效的方式:
-
if (document.all) { /* 只在 IE 中执行 */ }—— 这是经典写法,IE 返回 true,其他全部 false -
!!document.all === true在 IE 中成立,其余浏览器为 false - 避免用
typeof document.all === 'object'或document.all !== undefined,因为现代浏览器中它既存在又是 object 类型,无法区分
注意那些容易误判的情况
某些混淆操作会掩盖其真实布尔特性:
-
document.all == true:在 IE 中为 true,但在非 IE 中因类型转换可能意外为 true(如document.all == 1在某些旧版非 IE 中曾返回 true),不推荐 -
Boolean(document.all):本质等价于!!document.all,安全,但冗余 -
'all' in document:返回 true(所有浏览器都支持该属性),无法用于 IE 判断
现代替代方案早已明确
用 document.all 做浏览器检测已属过时做法。推荐转向标准方式:
- 特征检测优先:如
if ('msMaxTouchPoints' in navigator)(IE 特有)、if ('ontouchstart' in window) - UA 字符串解析(仅作兜底):匹配
MSIE或Trident - 真正需要兼容老 IE?应配合
document.documentMode综合判断










