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

typeof [] ==="object" ; // true
typeof {} === "object"; // true

但是typeof用来区别对象与基本数据类型时就比较有用了。

基本数据类型检测

由于typeof对所有对象和数组类型返回的都是"object",所以它在区别对象与基本数据类型时才有用。一个值使用typeof操作符可能返回下列某个字符串,注意是字符串:

"undefined"表示这个值未定义

"boolean"表示这个值是布尔值

"string"表示这个值是字符串

"number"表示这个值是数值

"object"表示这个值是对象或null(注意:typeof null 将返回"object",不能准确地判断类型的合法性,因此不能用typeof来检测对象类型。)

"function"表示这个值是函数(注意:Safari第四版在对正则表达式使用typeof操作符时回返回"function",因此很难确定这个值到底是不是函数。)

引用类型检测

JavaScript引用类型有:Object、Array、Date、Error、RegExp、Function、基本包装类型(Boolean类型、Number类型、String类型)、单体内置对象(Global对象、Math对象)等。检测引用类型可以使用 instanceof 和 Object.toString()方法。

instanceof 运算符

instanceof运算符要求其左边的运算数是一个对象,右边的运算数则是对象类的名字。如果该运算符的左边的对象是右边类的一个实例,则返回true,否则返回false。例如:

var d = new Date();

d instanceof Date; // true
d instanceof Object; // true
d instanceof Number ; //false var a = [];
a instanceof Array ; // true
a instanceof Object; // true
a instanceof RegExp; // false

但是利用instanceof 操作符确定某个对象是不是数组会有些问题,例如:

if( value instanceof Array ) {
// do something
}

instanceof 操作符的问题在于,它假定只有一个全局执行环境。如果网页中包含多个框架,那其实就存在两个以上不同的全局执行环境,从而存在两个以上不同的Array构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组就会分别具有各自的不同的构造函数。因此在第二个框架对传入的数组执行 value instanceof Array 就会返回false了,因为构造函数是不一样的。

Object.toString()检测对象类型

在任何值上调用原生的toString()方法,都会返回一个[object nativeConstructorName] 格式的字符串。每个类在内部都会有一个[[Class]]属性,这个属性就指定上述字符串中的构造函数名。例如:

// 检测数组类型
function isArray(value){
return Object.prototype.toString.call(value) == "[object Array]"
} // 检测函数
function isFunction(value){
return Object.prototype.toString.call(value) == "[object Function]"
} // 检测正则表达式
function isRegExp(value){
return Object.prototype.toString.call(value) == "[object RegExp]"
}

注意:对于在IE中以COM对象形式实现的任何函数,isFunction() 都将返回false,因为它们并非原生的JavaScript函数。

jQuery检测对象类型也是用到了toString()方法,查看type()方法的实现可以看到:

//version:jquery-1.11.3

var class2type = {};
// Populate the class2type map
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
});
type: function( obj ) {
if ( obj == null ) {
return obj + "";
}
return typeof obj === "object" || typeof obj === "function" ?
class2type[ toString.call(obj) ] || "object" :
typeof obj;
}

通过定义一个class2type对象把所有类型的toString()返回值通过键值对存储起来。在调用type方法时通过toString()方法返回值进行匹配,最后返回检测值的类型。

总结

在区别基本数据类型和对象类型时可以使用typeof运算符,对于对象的类型确定通常使用原生toString()检测,注意Object.prototype.toString() 本身也可能被修改。

以上是JavaScript类型检测的一些基础知识总结,干货不多,望各位大神指教,欢迎留言讨论。

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

  1. Javascript类型检测

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

  2. javascript 类型检测

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

  3. JavaScript类型检测汇总

        曾经我以为JavaScript中的类型检测只要使用 typeof 或 instanceof 就可以通通解决.后来我发现我是too young too naive啊!早说过JavaScript是 ...

  4. JavaScript 类型 检测

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

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

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

  6. JavaScript——类型检测

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

  7. javascript类型与类型检测

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

  8. 小结 javascript中的类型检测

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

  9. JavaScript的三种类型检测typeof , instanceof , toString比较

    1.typeof typeof是js的一个操作符,在类型检测中,几乎没有任何用处. typeof 返回一个表达式的数据类型的字符串,返回结果为javascript中的基本数据类型,包括:number. ...

随机推荐

  1. JavaScript获取图片的原始尺寸

    页面里的img元素,想要获取它的原始尺寸,以宽度为例可能首先想到的就是width,如下 <img src="http://img11.360buyimg.com/da/g14/M07/ ...

  2. nodejs字符与字节之间的转换

    new Buffer("Hello World").toString("base64"); /* yields SGVsbG8gV29ybGQNCg== */ ...

  3. 你见过吗?9款超炫的复选框(Checkbox)效果

    复选框(Checkbox)在各个浏览器中的效果不一致,因此很多 Web 开发人员会自己重新设计一套界面和使用体验都更佳的复选框功能.下面就给大家分享9款超炫的复选框(Checkbox)效果,纯 CSS ...

  4. 全球酷站秀:15个顶尖的 CSS3 网站作品

    每天有数以百计的网站推出,其中很多优秀网站被推荐到 CSS 画廊供大家评分和评论,这对于网页设计师来说是很好的灵感来源.今天,我们选择了15个来自全球各地的 CSS3 网站设计作品, 它们都是赢得 C ...

  5. Spring应用教程-3 依赖关系配置

    注:组件与组件之间的耦合,采用依赖注入管理,但普通的JavaBean属性值,应直接在代码中设置. 1. 注入其他Bean的属性值 我们分析一下,Bean_A的一个属性要依赖Bean_B的一个属性值.这 ...

  6. 第21/24周 性能监控(PAL工具)

    大家好,欢迎来到性能调优培训的最后一个月.在过去的5个月里,我们谈了SQL Server的各种性能相关的话题,包括性能调优的技术和问题. 但当在你面前,SQL Server没有按你预想的运行时,你会怎 ...

  7. JS弹出框插件zDialog再次封装

    zDialog插件网址:http://www.jq22.com/jquery-info2426 再次封装zDialog的代码: (function ($) { $.extend({ iDialog: ...

  8. Razor练习4

    今天练习Razor的逻辑处理.一般会使用下面 1. if 2. else 3. else if 4. switch 下面演示中,Insus.NET分别演示1,2, 4:xxx.cshtml代码如下: ...

  9. 控件使用经验-MVP模式+控件封装

    项目背景 几年前参与了一个面向学校的人事管理软件的开发,基于WinForm平台.今天主要想谈一谈其中关于控件的使用经验.这个项目我们大量使用了第三方控件.由于这个产品的生命周期很长,我们在设计时要考虑 ...

  10. 单元测试与Nunit的基本使用

    一.单元测试是什么 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,C# ...