各浏览器对typeof运算符的实现差异
1,IE6/7/8中typeof运算符对BOM对象如window,document,location,history等对象的方法返回“object”,标准浏览器都返回“function”。
|
1
2
3
4
5
6
|
alert(typeof window.alert); // objectalert(typeof document.write); // objectalert(typeof document.getElementById); // objectalert(typeof document.getElementsByTagName); // objectalert(typeof location.reload); // objectalert(typeof history.go); // object |
2,Safari/Chrome对正则对象返回function,其它浏览器返回object
|
1
2
3
|
var bb = new RegExp('bb');alert(typeof /aa/);// --> functionalert(typeof bb);// --> function |
3,Safari对NodeList返回function,其它浏览器返回object
|
1
2
3
4
|
var nodes1 = document.body.children nodes2 = document.body.childNodes;alert(typeof nodes1);alert(typeof nodes2); |
关于typeof运算符,ECMAScript5 11.4.3节有相关说明(注意result都是字符串)

从上表可以看出
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方法。如
|
1
2
3
|
var reg = /aa/;alert(reg.call); // undefinedalert(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/7/8中alert是没有call方法的,因此typeof window.alert,IE6/7/8中返回“object”也没有违背规范,只是让开发者觉得很困惑,因为从学JS的第一天开始就认为alert是window对象的一个方法/函数。
正因为ECMAScript对于宿主对象没有严格的定义typeof,从而在IE中使用typeof运算符返回"date"、"unknow"之类的就不足为奇了。
|
1
2
|
xhr = new ActiveXObject("Msxml2.XMLHTTP");alert(typeof xhr.abort); // IE6/7/8/9中都返回 unknow |
各浏览器对typeof运算符的实现差异的更多相关文章
- tips instanceof运算符和typeof运算符的区别
tips instanceof运算符和typeof运算符的区别 一.instanceof运算符: 此运算符可以判断一个变量是否是某个对象(类)的实例,返回值是布尔类型的(true和fal ...
- JavaScript中instanceof与typeof运算符的用法及区别详细解析
JavaScript中的instanceof和typeof常被用来判断一个变量是什么类型的(实例),但它们的使用还是有区别的: typeof 运算符 返回一个用来表示表达式的数据类型的字符串. typ ...
- 浅析JavaScript中的typeof运算符
对JavaScript中的typeof运算符进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助. 如果typeof的运算符是数字.字符串或者布尔值,它返回的结果就是"numb ...
- 【转载】C#使用typeof运算符获取对象变量的具体类型Type
在C#的实际类型操作过程中,有时候需要通过typeof方法获取对象的类型对应的Type变量即具体类型,例如在获取DataTable中某一列的具体数据类型的时候,我们就会用到typeof方法来获取具体的 ...
- JavaScript中“typeof”运算符与“instanceof”运算符的差异
在JavaScript中,运算符“typeof”和“instanceof”都可以用来判断数据的类型,那么这两个运算符有什么不同之处呢? 差异一:使用方式不同. 最明显的差异就是这两个运算符的使用方式了 ...
- JavaScript中使用typeof运算符需要注意的几个坑
typeof是一个运算符,它对操作数返回的结果是一个字符串,有6种(只针对ES,不包含HOST环境对象). 1.'undefined'2.'boolean'3.'string'4.'number'5. ...
- typeof运算符
javascript中typeof用来判断一个变量或表达式的数据类型. typeof 返回值有六种可能: "number," "string," "b ...
- 浏览器对document.all的支持差异
从何而来从IE4开始IE的object model才增加了document.all对象,MSDN中也对 Object.all 有详细的说明,Object.all是个HTMLCollection,不是数 ...
- JavaScript typeof运算符和数据类型
// js有6种数据类型:Undefined.Null.Boolean.String.Number.Object //(01)typeof console.log(typeof undefined); ...
随机推荐
- SharePoint 2013开发环境准备一些小事项
开发慢慢向着SharePoint 2013迁移,环境也开始慢慢准备起来了.由于FAST Search的集成,和缓存服务的加入,SharePoint 2013对开发机器要求的不是一般的高.这里介绍一下如 ...
- Android主线程不能访问网络异常解决办法
从两个方面说下这个问题: 1. 不让访问网络的原因 2. 解决该问题的办法 不让访问网络的原因: 由于对于网络状况的不可预见性,很有可能在网络访问的时候造成阻塞,那么这样一来我们的主线程UI线程 就会 ...
- Unable to execute dex: Multiple dex files define Lcom/kenai/jbosh/AbstractAttr
出现该问题应该是导入项目的android版本问题. 编译的时候把build path 下 source选项卡中的libs去掉就正常了. http://blog.csdn.net/e421083 ...
- C标准库<assert.h>实现
本文地址:http://www.cnblogs.com/archimedes/p/c-library-assert.html,转载请注明源地址. 1.背景知识 头文件<assert.h>唯 ...
- 初识UIScrollView
RootView.m #import "RootView.h" #define YHColor [UIColor colorWithRed:arc4random() % 256 / ...
- IOS之UI--小实例项目--添加商品和商品名(使用xib文件终结版) + xib相关知识点总结
添加商品和商品名小项目(使用xib文件终结版) 小贴士:博文末尾有项目源码在百度云备份的下载链接. xib相关知识点总结 01-基本使用 一开始使用xib的时候,如果要使用自定义view的代码,就需要 ...
- Mac平台下启动MySQL到完全终止MySQL----终端八步走
1.选中Finder的情况下,快捷键进入搜索目录:/usr/local 然后进入mysql目录下: 2.右键 "从这里启动" 打开终端: 3.输入执行:./scripts/mysq ...
- Mac OS X 10.10 Yosemite下面解决XAMPP无法开启mysql的问题
首次使用XAMPP但是却遇到一个MySQL无法启动的缘故,不知道怎么解决,经过百度 找到解决方案: 在xampp安装目录下找到xamp这个文件(默认路径是:/Applications/XAMPP/xa ...
- 《慕客网:IOS基础入门之Foundation框架初体验》学习笔记 <五> NSDicionary + NSMutableDictionary
int main(int argc, const char * argv[]) { @autoreleasepool { //字典, 存储的内存不是连续的 用key和value进行对应(键值) //k ...
- jquery eq 用法
<html> <head> <script src='jquery.min.js'></script> <script type="te ...