曾经我以为JavaScript中的类型检测只要使用 typeof instanceof 就可以通通解决。后来我发现我是too young too naive啊!早说过JavaScript是个不严密,有缺陷的语言,通过类型检测才深深地领悟到这一点。接下来我就来剖析下这里面的漏洞及最靠谱的检测方法吧!

一、typeof运算符

    相信很多同学还跟我曾经以为的一样,typeof操作符只是判断对象类型上不太靠谱,它还是可以用来检测原始值类型的,比如数字、字符串、布尔型。但看了下面的例子你就不这么认为了。

typeof 'foo'                 //  'string'
typeof new String('foo') // 'object' typeof 2 // 'number'
typeof new Number(2) // 'object' typeof true // 'boolean'
typeof new Boolean(true) // 'object'

 

    看出来了么,都是同样的值,如果用构造函数来创建原始值那么用typeof检测的结果就都是’object’!这显然不是我们想要的结果。

二、instanceof运算符

    那有人说了,typeof沦陷了,我们还有instanceof啊,可是别忘了 instanceof本质上是检测引用类型的原型链的,所以对原始值就根本没有作用。例如:

'foo' instanceof String     // false
'foo' instanceof Object // false new String('foo') instanceof String //true
new String('foo') instanceof Object //true

 

    看到了吧,还是不靠谱。

    好吧,让instanceof做不属于它的工作是对它不太公平啦!那让它检测引用类型呢?其实它检测引用类型也有一个严重的限制: 不能跨帧使用。

    假设一个浏览器帧A(frame A)里的一个对象被传入到帧B(frame B)中,两个帧中都定义了Person构造函数,如果来自帧A 的对象是帧A 中Person的实例,则有:

personA instanceof frameAPerson   //true
personA instanceof frameBPerson //false

 

    因为每个帧都有Person的拷贝,它被认为是该帧中的Person的拷贝实例,尽管两个定义是一样的。

    同样的问题也出现在其他两个非常重要的内置类型中:数组和函数,所以检测这两个内置类型一般不用instanceof。

    而且instanceof对于对象的整个原型链都能检测到,例如:

var now = new Date();

now instanceof Date;    //true
now instanceof Object; //true

    因此,用instanceof检测某一对象是否属于特定类型并非最佳。

三、最佳方法

    typof和instanceof已经都被否决了,那么最靠谱的检测方法是什么呢?

    对于JS的内部类型如Number, String, Boolean, Array, Function, Object, RegExp, Date, Error, Math, JSON可以调用Object的内部方法toString, 它可以返回一下格式的信息:’[object ‘+ type + ‘]’,例如:

Object.prototype.toString.call('foo') === '[object String]';  //true
Object.prototype.toString.call([1,2,3]) === '[object Array]'; //true

 

    用这个方法判断以上给出的类型,不管任何浏览器都会返回一样的格式,而且满足跨帧要求。

JavaScript类型检测汇总的更多相关文章

  1. 谈谈JavaScript类型检测

      javascript内置的类型检测机制并非完全可靠.比如typeof操作符,并不能准确的判断数据是哪个类型,比如:数组和对象就不能通过typeof来区分. typeof [] ==="o ...

  2. Javascript类型检测

    原地址 http://www.cnblogs.com/fool/archive/2010/10/07/javascrpt.html 开门见山,我们先来看一下代码: var is = function ...

  3. javascript 类型检测

    javascript数据类型分为简单数据类型和复杂数据类型.简单数据类型分为string,number,boolean,defined,null,复杂数据类型为Object.类型检测在写代码可能会非常 ...

  4. JavaScript 类型 检测

    前言 ECMAScript中有5种数据类型,分别为Number,Boolean,Null,Undifined和String,以及一种复杂的数据类型Object(由名值对组成,是这门语言所有对象的基础类 ...

  5. 类型检测汇总!typeof 和 instanceof 和isArray

    , ]; alert(arr instanceof Array);//true 以上老方法判断是否是数组,存在一个问题,就是它只适用于单执行环境(窗口),如果该窗口有其他框架(比如 iframe)则会 ...

  6. JavaScript类型检测, typeof操作符与constructor属性的异同

    *#type.js function Person(name, age) { this.name = name; this.age = age; } var d = {an: 'object'}; v ...

  7. JavaScript——类型检测

    要检测一个变量是否是基本数据类型,可以用 Typeof 操作符.如果我们想知道它是什么类型的对象,我们可以用instanceof 操作符,语法如下所示: result=variable instanc ...

  8. javascript类型与类型检测

    1.javascript类型: 注:包装对象:如"hello".length实际为js为我们隐式创建了一个String临时对象,去调用该对象的length属性,调用过后再将该临时对 ...

  9. 小结 javascript中的类型检测

    先吐槽一下博客园的编辑器,太不好用了,一旦粘贴个表格进来就会卡死,每次都要用html编辑器写,不爽! 关于javascript的类型检测,早在实习的时候就应该总结,一直拖到现在,当时因为这个问题还出了 ...

随机推荐

  1. Android MVP模式简单易懂的介绍方式 (一)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 最近正在研究Android的MVP模式 ...

  2. Synchronized块同步变量的误区

    我们可以通过synchronized块来同步特定的静态或非静态方法.要想实现这种需求必须为这些特性的方法定义一个类变量,然后将这些方法的代码用synchronized块括起来,并将这个类变量作为参数传 ...

  3. Set与List之间转化

    List list = new ArrayList(set);Set set = new HashSet(list); //但是有一点,转换当中可能要丢失数据,尤其是从list转换到set的时候,因为 ...

  4. 大神的---解决tomcat内存溢出问题----tomcat报错:This is very likely to create a memory leak问题解决

    tomcat memory leak解决方案 这种问题在开发中经常会碰到的,看看前辈的总结经验 Tomcat内存溢出的原因  在生产环境中tomcat内存设置不好很容易出现内存溢出.造成内存溢出是不一 ...

  5. flask 常见关系模板代码

    以下罗列了使用关系型数据库中常见关系定义模板代码 一对多示例场景:用户与其发布的帖子(用户表与帖子表)角色与所属于该角色的用户(角色表与多用户表)示例代码class Role(db.Model): & ...

  6. Centos7.2下编译安装python3.7

    1.安装python3.7所需要的依赖. yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel rea ...

  7. HDFS Hbase

    Hbase:Hbase是Hadoop的数据库,是bigtable的实现,基于HDFSHDFS:文件系统,是gfs的实现 Hive,Hbase,HDFS等之间的关系Hive:Hive不支持更改数据的操作 ...

  8. appium desktop v1.2.7在android7.0上运行报错“Error: Error executing adbExec”

    1.参考下面链接,https://stackoverflow.com/questions/42283921/unable-to-run-appium-tests-on-android-7-0:得知需要 ...

  9. Windows Server 2012 R2 Standard x64 deploy Visual Studio 2015 Application

    When I run the Server application on Windows Server 2012 R2 operation system. I meet the error:MSVCP ...

  10. MP3 Lame 转换 参数 设置(转)

    我们在对音频格式的转换中,打交道最多的就是MP3了.如果你能彻底玩转MP3,那么对你的音频创作和对其他音频格式的掌握会有很大的帮助.下面我们给大家介绍MP3制作软件:LAME 要制作出高音质的MP3靠 ...