JavaScript类型检测汇总
曾经我以为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类型检测汇总的更多相关文章
- 谈谈JavaScript类型检测
javascript内置的类型检测机制并非完全可靠.比如typeof操作符,并不能准确的判断数据是哪个类型,比如:数组和对象就不能通过typeof来区分. typeof [] ==="o ...
- Javascript类型检测
原地址 http://www.cnblogs.com/fool/archive/2010/10/07/javascrpt.html 开门见山,我们先来看一下代码: var is = function ...
- javascript 类型检测
javascript数据类型分为简单数据类型和复杂数据类型.简单数据类型分为string,number,boolean,defined,null,复杂数据类型为Object.类型检测在写代码可能会非常 ...
- JavaScript 类型 检测
前言 ECMAScript中有5种数据类型,分别为Number,Boolean,Null,Undifined和String,以及一种复杂的数据类型Object(由名值对组成,是这门语言所有对象的基础类 ...
- 类型检测汇总!typeof 和 instanceof 和isArray
, ]; alert(arr instanceof Array);//true 以上老方法判断是否是数组,存在一个问题,就是它只适用于单执行环境(窗口),如果该窗口有其他框架(比如 iframe)则会 ...
- JavaScript类型检测, typeof操作符与constructor属性的异同
*#type.js function Person(name, age) { this.name = name; this.age = age; } var d = {an: 'object'}; v ...
- JavaScript——类型检测
要检测一个变量是否是基本数据类型,可以用 Typeof 操作符.如果我们想知道它是什么类型的对象,我们可以用instanceof 操作符,语法如下所示: result=variable instanc ...
- javascript类型与类型检测
1.javascript类型: 注:包装对象:如"hello".length实际为js为我们隐式创建了一个String临时对象,去调用该对象的length属性,调用过后再将该临时对 ...
- 小结 javascript中的类型检测
先吐槽一下博客园的编辑器,太不好用了,一旦粘贴个表格进来就会卡死,每次都要用html编辑器写,不爽! 关于javascript的类型检测,早在实习的时候就应该总结,一直拖到现在,当时因为这个问题还出了 ...
随机推荐
- 塔防游戏 Day2
1. 创建炮塔选择的 UI 使用 UI -> Toggle .注意指定同一 group. 2. 创建炮台的数据类 [System.Serializable] // 序列化 public clas ...
- Hibernate的HQL中in参数设置
平时经常用Hibernate,由于习惯表间不建立关联,所以HQL查询时候经常要用in语句. 我最常用的情况有2种: 1.in后是个子查询,如 FROM A WHERE A.ID IN (SELECT ...
- go_内建变量类型
bool, string (u)int, (u)int8, (u)int16, (u)int32, (u)int64, uintptr (uintptr 是指针) byte, rune(表示字符cha ...
- Ajax工作原理和原生JS的ajax封装
前言: 之所以用ajax作为博客的开篇,是因为无论从ajax的出现还是从它的作用上来说,ajax对于前端无疑是意义重大的.甚至可以说,是ajax带来了前端这个行业.当然,历史并不能说明当下,曾经的辉煌 ...
- 85. Maximal Rectangle 由1拼出的最大矩形
[抄题]: Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1 ...
- 2-字符串模拟- URL映射
问题描述 试题编号: 201803-3 试题名称: URL映射 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 URL 映射是诸如 Django.Ruby on Rails 等 ...
- Can not find -lXXXX
Description I had the error message Can not find -lGL when i run qt qmake long ago. The error messag ...
- C#中一个窗口是一个类呢,还是一个窗口类的实例呢?(转)
C#中一个窗口是一个类呢,还是一个窗口类的实例呢? 答: 没有一个人说到重点上. 一个窗口,它不是仅仅用一个类可以描述的: 首先,这个窗口的数据类型类型,是从Form类派生下来的,也就是说它的定义是一 ...
- python中执行命令的3种方法小结-乾颐堂
目前我使用到的python中执行cmd的方式有三种: 1. 使用os.system("cmd") 特点是执行的时候程序会打出cmd在linux上执行的信息. import os o ...
- hadoop分布式集群搭建前期准备(centos7)
那玩大数据,想做个大数据的从业者,必须了解在生产环境下搭建集群哇?由于hadoop是apache上的开源项目,所以版本有些混乱,听说都在用Cloudera的cdh5来弄?后续研究这个吧,就算这样搭建不 ...