设为首页收藏本站

就爱编程论坛

 找回密码
 注册

人人连接登陆

无需注册,直接登录

用新浪微博连接

一步搞定

QQ登录

只需一步,快速开始

查看: 509|回复: 0
打印 上一主题 下一主题

各浏览器对typeof运算符的实现差异 [复制链接]

Rank: 9Rank: 9Rank: 9

  • TA的每日心情
    无聊
    2025-5-27 03:37:20
  • 签到天数: 366 天

    [LV.9]以坛为家II

    论坛先锋 学习至圣 荣誉成员 论坛元老 活跃之星 终极领袖

    我玩的应用:

    跳转到指定楼层
    楼主
    发表于 2011-7-11 00:47:58 |只看该作者 |倒序浏览
    1,IE6/7/8中typeof运算符对BOM对象如window,document,location,history等对象的方法返回“object”,标准浏览器都返回“function”。
    view sourceprint?

    1alert(typeof window.alert); // object

    2alert(typeof document.write); // object

    3alert(typeof document.getElementById); // object

    4alert(typeof document.getElementsByTagName); // object

    5alert(typeof location.reload); // object

    6alert(typeof history.go); // object





    2,Safari/Chrome对正则对象返回function,其它浏览器返回object
    view sourceprint?

    1var bb = new RegExp('bb');

    2alert(typeof /aa/);// --> function

    3alert(typeof bb);// --> function





    3,Safari对NodeList返回function,其它浏览器返回object
    view sourceprint?

    1var nodes1 = document.body.children

    2    nodes2 = document.body.childNodes;

    3alert(typeof nodes1);

    4alert(typeof nodes2);





    关于typeof运算符,ECMAScript5 11.4.3节有相关说明

    从上表可以看出
    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方法。如
    view sourceprint?

    1var reg = /aa/;

    2alert(reg.call); // undefined

    3alert(reg.test); // native code




    因此对于typeof运算应该返回“object”而不是“function”。

    对于第一条和第三条,宿主对象,除了不能返回"undefined"、"boolean"、"number"、"string"外,具体返回啥由浏览器自行实现。我们看一个示例window.alert
    view sourceprint?

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




    可以看到IE6/7/8中alert是没有call方法的,因此typeof window.alert,IE6/7/8中返回“object”也没有违背规范,只是让开发者觉得很困惑,因为从学JS的第一天开始就认为alert是window对象的一个方法/函数。
    正因为ECMAScript对于宿主对象没有严格的定义typeof,从而在IE中使用typeof运算符返回"date"、"unknow"之类的就不足为奇了。
    view sourceprint?

    1xhr = new ActiveXObject("Msxml2.XMLHTTP");

    2alert(typeof xhr.abort); // IE6/7/8/9中都返回 unknow




    附件: 你需要登录才可以下载或查看附件。没有帐号?注册 人人连接登陆
    分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    分享分享0 收藏收藏0 支持支持0 反对反对0 分享到人人 转发到微博
    [img=http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=fRUcHhYWGAQ9GxIFEBwUEVMeEhA]http://rescdn.qqmail.com/zh_CN/htmledition/images/function/qm_open/ico_mailme_02.png[/img]

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册 人人连接登陆

    晴云孤魂's Blog|就爱编程搜帖|手机版|Archiver|就爱编程论坛     

    GMT+8, 2025-7-2 13:32 , Processed in 0.152748 second(s), 29 queries .

    Powered by Discuz! X2

    © 2001-2011 Comsenz Inc.

    回顶部