何炼文新概念个人博客

研究javascript,css3,html5,nodejs,Ext js等技术研究。

您现在的位置是: 首页 > 技术分享 > 日记

JavaScript中运算符typeof的使用

发布时间:2014-08-12分享人:人浏览有0人评论

    typeof 运算符,返回值是有六种可能的,typeof是一个用来表示表达式的数据类型的字符串。它使用方法:typeof[()expression[]] ;其中expression 参数是需要查找类型信息的任意表达式。 typeof 返回值有六种可能: "number," "string," "boolean," "object," "function," 和 "undefined."JavaScript中typeof运算符说明:typeof 运算符把类型信息当作字符串返回。
    使用方法:typeof[()expression[]] ;typeof 语法中的圆括号是可选项。一个用来表示表达式的数据类型的字符串。

    1,Safari对NodeList返回function,其它浏览器返回object

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

    3,IE6/ie7/IE8中typeof运算符对BOM对象如window,document,location,history等对象的方法返回“object”,标准浏览器都返回“function”。


    以上就是ECMA javaScript对typeof描述的全部。

     

    1,基本类型

    要注意的是对于Null返回的不是"null"而是"object",据说是ECMAScript早期版本的笔误而一直延续至今。

    对于Undefined、Null、Boolean、Number、String返回字符串"undefined"、"object"、"boolean"、"number"、"string"。

     

    2,对象类型

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

    普通对象如Object,Array等返回 “object”。

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

    宿主对象如window,没有实现call方法的对象返回是宿主自定义的,但不能是"undefined"、"boolean"、"number"、"string"。即宿主的实现不能是JS的基本类型的返回值,这是语言最核心的地方,否则会让人很困惑

     

     

     

         对于以上列举的三个差异的第二条:Safari/Chrome对正则对象返回function,别的浏览器是object返回,这可以认为是Safari/Chrome的Bug,即没有按标准ECMAScript5实现。正则表达式是非宿主普通对象(见ECMAScript5 15.10 RegExp (Regular Expression) Objects),而又没有实现call方法。如

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

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

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

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

          从这里可以看到IE6/IE7/IE8中alert输出是没有call方法的,因此typeof window.alert,IE6/IE7/IE8中返回“object”对象也没有违背规范,只是让开人员觉得很很难理解,因为从javascript的第一天开始就认为alert是window对象的一个方法/函数。正因为ECMAScript对于宿主对象没有严格的定义typeof,从而在IE中使用typeof运算符返回"date"、"unknow"之类的就不足为奇了。

关键字词  


如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。