ECMAScript各浏览器对typeof运算符的实现差别

1,IE6/7/8中typeof运算符对BOM对象如window,document,location,history等目的的形式重临“object”,标准浏览器都回去“function”。

alert(typeof window.alert); // object
alert(typeof document.write); // object
alert(typeof document.getElementById); // object
alert(typeof document.getElementsByTagName); // object
alert(typeof location.reload); // object
alert(typeof history.go); // object

2,Safari/Chrome对正则对象回来function,此外浏览器重返object

var bb = new RegExp('bb');
alert(typeof /aa/);// --> function
alert(typeof bb);// --> function

3,Safari对NodeList重临function,此外浏览器重临object

var nodes1 = document.body.children
    nodes2 = document.body.childNodes;
alert(typeof nodes1);
alert(typeof nodes2);

关于typeof运算符,ECMAScript5 11.4.3节有连带表达

ECMAScript 1

从上表可以看出

1,基本项目

对此Undefined、Null、Boolean、Number、String再次回到字符串”undefined”、”object”、”boolean”、”number”、”string”。
需注意的是对此Null再次来到的不是”null”而是”object”,据说是ECMAScript早期版本的笔误而直白继承至今。

2,对象类型

目标类型又分本地对象(Object)和宿主对象(window),本地对象又分普通对象和函数类型对象。因为JS中函数是一等公民,即函数本身也是个目标。由此需要区分下。这里的目标指没有落实call方法的靶子。

一般对象如Object,Array等返回 “object”。

函数类型对象如new Function形式或function fn(){}、var fn =
function(){}模式赶回“function”。

宿主对象如window,没有兑现call方法的目的回来是宿主自定义的,但不可以是”undefined”、”boolean”、”number”、”string”。即宿主的贯彻不可能是JS的骨干项指标再次来到值,这是语言最中央的地方,否则会令人很困惑。

以上就是ECMAScript对typeof描述的任何。

对于上述列举的五个出入的第二条:Safari/Chrome对正则对象回来function,另外浏览器重返object,那足以认为是Safari/Chrome的Bug,即没有按标准ECMAScript5实现。正则表明式是非宿主普通对象(见ECMAScript5
15.10 RegExp (Regular Expression) Objects),而又不曾兑现call方法。如

var reg = /aa/;
alert(reg.call); // undefined
alert(reg.test); // native code

所以对于typeof运算应该回到“object”而不是“function”。

对于第一条和第三条,宿主对象,除了无法回来”undefined”、”boolean”、”number”、”string”外,具体重回吗由浏览器自行实现。大家看一个演示window.alert

alert(alert.call); // IE6/7/8中undefined,IE9/Firefox/Safari/Chrome/Opera中native code

ECMAScript,可以见见IE6/7/8中alert是从未有过call方法的,因而typeof
window.alert,IE6/7/8中回到“object”也并未背离规范,只是让开发者觉得很迷惑,因为从学JS的第一天起首就以为alert是window对象的一个措施/函数。

正因为ECMAScript对于宿主对象没有严厉的定义typeof,从而在IE中使用typeof运算符重回”date”、”unknow”之类的就无独有偶了。

xhr = new ActiveXObject("Msxml2.XMLHTTP");
alert(typeof xhr.abort); // IE6/7/8/9中都返回 unknow