typeof在不同浏览器中存在差异,主要体现在dom/bom方法(ie6–8返回"object")、正则表达式(旧版safari/chrome返回"function")和nodelist(safari曾返回"function")三类值上,需结合其他方法做可靠判断。

typeof 在不同浏览器中确实存在几处关键差异,主要集中在宿主对象(如 DOM/BOM 方法)、正则表达式和 NodeList 这三类值上。这些差异源于早期引擎实现方式不同,并非全部符合 ECMAScript 标准,因此在做类型判断时需特别留意。
DOM/BOM 方法在 IE6–8 中返回 "object"
IE6–8 的 JScript 引擎通过 COM 组件桥接浏览器内核,导致原本是函数的宿主方法(如 document.write、window.alert、location.reload)被转换为普通对象:
-
typeof document.getElementById === "object"(IE6–8),而标准浏览器返回"function" - IE9+ 已修复此问题,行为与其他现代浏览器一致
- 实际开发中若需准确判断是否可调用,不能只依赖
typeof,建议结合typeof x === "function" || (typeof x === "object" && typeof x.call === "function")
正则表达式在 Safari/Chrome 旧版本中返回 "function"
根据 ECMAScript 5 规范,RegExp 实例属于普通对象,不具 call 方法,typeof /a/ 应统一返回 "object":
- Safari 和早期 Chrome(约 v20 前)错误地返回
"function" - 可通过
Object.prototype.toString.call(/a/) === "[object RegExp]"做更可靠的检测 - 现代 Chrome、Firefox、Edge 及 Safari 最新版均已修正,返回
"object"
NodeList 在 Safari 中被误判为 "function"
NodeList 是宿主提供的类数组对象,规范要求其 typeof 返回 "object":
- Safari 曾将
document.querySelectorAll("div")或element.children返回的 NodeList 判为"function" - 其他主流浏览器(包括 Firefox、Chrome、Edge)始终返回
"object" - 稳妥做法是用
Array.isArray()排除数组,再用Symbol.iterator in nodeList或nodeList.item属性辅助判断
Null 和宿主对象的共性陷阱
虽然不是浏览器差异,但常被混淆:
-
typeof null在所有浏览器中都返回"object"——这是历史遗留 bug,ECMAScript 从未修正 - 宿主对象(如
XMLHttpRequest、ActiveXObject)的typeof行为由浏览器自行定义,只要不返回基本类型字符串(如"undefined"或"string")即合规 - 若需跨浏览器安全识别函数,优先使用
Object.prototype.toString.call(fn) === "[object Function]"











