JS检测数据类型
如果你要判断的是基本数据类型或JavaScript内置对象,使用toString; 如果要判断的时自定义类型,请使用instanceof。
1.typeof
typeof操作符返回的是类型字符串,它的返回值有6种取值:
typeof 3 // "number"
typeof "abc" // "string"
typeof {} // "object"
typeof true // "boolean"
typeof undefined // "undefined"
typeof function(){} // "function"
所有对象的typeof都是"object",不能用于检测用户自定义类型。 比如Date, RegExp, Array, DOM Element的类型都是"object":
typeof [] // "object"
typeof还有一个知名的bug:
typeof null // "object"
null是基本数据类型,它的类型显然是Null。其实这也反映了null的语义, 它是一个空指针表示对象为空,而undefined才表示什么都没有。 总之,typeof只能用于基本数据类型检测,对于null还有Bug。
2.instanceof
instanceof操作符用于检查某个对象的原型链是否包含某个构造函数的prototype属性。例如:
obj instanceof Widget
obj的原型链上有很多对象(隐式原型),比如:obj.__proto__, obj.__proto__.__proto__, ...
如果这些对象里存在一个p === Widget.prototype,那么instanceof结果为true,否则为false。
instanceof是通过原型链来检查类型的,所以适用于任何"object"的类型检查。
// 比如直接原型关系
function Animal(){ }
(new Animal) instanceof Animal // true // 原型链上的间接原型
function Cat(){}
Cat.prototype = new Animal
(new Cat) instanceof Animal // true
instanceof也可以用来检测内置兑现,比如Array, RegExp, Object, Function:
[1, 2, 3] instanceof Array // true
/abc/ instanceof RegExp // true
({}) instanceof Object // true
(function(){}) instanceof Function // true
instanceof对基本数据类型不起作用,因为基本数据类型没有原型链。
3 instanceof Number // false
true instanceof Boolean // false
'abc' instanceof String // false
null instanceof XXX // always false
undefined instanceof XXX // always false
但你可以这样:
new Number(3) instanceof Number // true
new Boolean(true) instanceof Boolean // true
new String('abc') instanceof String // true
但这时你已经知道数据类型了,类型检查已经没有意义了。
另外,instance还存在着跨窗口的问题
iWindow.document.write('<script> var arr = [1, 2]</script>');
iWindow.arr instanceof Array // false
iWindow.arr instanceof iWindow.Array // true
3.constructor
constructor属性返回一个指向创建了该对象原型的函数引用。需要注意的是,该属性的值是那个函数本身。例如:
function Animal(){}
var a = new Animal
a.constructor === Animal // true
constructor不适合用来判断变量类型。首先因为它是一个属性,所以非常容易被伪造:
var a = new Animal
a.constructor == Array
a.constructor === Animal // false
另外constructor指向的是最初创建当前对象的函数,是原型链最上层的那个方法:
function Cat(){}
Cat.prototype = new Animal
function BadCat(){}
BadCat.prototype = new Cat
(new BadCat).constructor === Animal // true
Animal.constructor === Function // true
与instanceof类似,constructor只能用于检测对象,对基本数据类型无能为力。 而且因为constructor是对象属性,在基本数据类型上调用会抛出TypeError异常:
null.constructor // TypeError!
undefined.constructor // TypeError!
与instanceof不同的是,在访问基本数据类型的属性时,JavaScript会自动调用其构造函数来生成一个对象。例如:
(3).constructor === Number // true
true.constructor === Boolean // true
'abc'.constructor === String // true
// 相当于
(new Number(3)).constructor === Number
(new Boolean(true)).constructor === Boolean
(new String('abc')).constructor === String
4.toString
toString方法是最为可靠的类型检测手段,它会将当前对象转换为字符串并输出。 toString属性定义在Object.prototype上,因而所有对象都拥有toString方法。 但Array, Date等对象会重写从Object.prototype继承来的toString, 所以最好用Object.prototype.toString来检测类型。
toString = Object.prototype.toString; toString.call(new Date); // [object Date]
toString.call(new String); // [object String]
toString.call(Math); // [object Math]
toString.call(3); // [object Number]
toString.call([]); // [object Array]
toString.call({}); // [object Object] // Since JavaScript 1.8.5
toString.call(undefined); // [object Undefined]
toString.call(null); // [object Null]
toString也不是完美的,它无法检测用户自定义类型。 因为Object.prototype是不知道用户会创造什么类型的, 它只能检测ECMA标准中的那些内置类型。
toString.call(new Animal) // [object Object]
因为返回值是字符串,也避免了跨窗口问题。当然IE弹窗中还是有Bug,不必管它了。
和Object.prototype.toString类似地,Function.prototype.toString也有类似功能, 不过它的this只能是Function,其他类型(例如基本数据类型)都会抛出异常。
判断window对象:
isWindow: function(obj){
return obj && typeof obj === 'object' && "setInterval" in obj;
}
JS检测数据类型的更多相关文章
- js检测数据类型四种办法
面试题中经常会考js数据类型检测,今天我来分享一下js中常用的四种方法判断数据类型,欢迎指点更正. 废话不多说,直入正题. 1.typeof console.log(typeof "&quo ...
- js检测数据类型的方法你都掌握了几个?
//1.typeof检测/*var obg = {};var ary = [];var reg = /^$/;var fn = function () {};var num = 1;var bool ...
- js中检测数据类型的几种方式
1.typeof 一元运算符,用来检测数据类型.只可以检测number,string,boolean,object,function,undefined. 对于基本数据类型是没有问题的,但是遇到引用数 ...
- JS中检测数据类型的多种方法
面试当中经常会问到检测 js 的数据类型,我在工作当中也会用到这些方法.让我们一起走起!!! 首先给大家上一个案例 console.log(typeof "langshen"); ...
- js中的数据类型,以及如何检测数据类型
基本数据类型:string,number,boolean,null,undefined,symbol 引用数据类型:object(array,function...) 常用的检测数据类型的方法一般有以 ...
- JS中检测数据类型的几种方式及优缺点【转】
1.typeof 用来检测数据类型的运算符 typeof value 返回值首先是一个字符串,其次里面包含了对应的数据类型,例如:"number"."string&quo ...
- JS中检测数据类型的几种方式及优缺点
1.typeof 用来检测数据类型的运算符 typeof value 返回值首先是一个字符串,其次里面包含了对应的数据类型,例如:"number"."string&quo ...
- JS中检测数据类型的四种方法
1.typeof 用来检测数据类型的运算符->typeof value->返回值首先是一个字符串,其次里面包含了对应的数据类型,例如:"number"."st ...
- JS中检测数据类型的四种方式及每个方式的优缺点
//1.typeof 用来检测数据类型的运算符 //->typeof value //->返回值首先是一个字符串,其次里面包含了对应的数据类型,例如:"number". ...
随机推荐
- Jboss,Tomcat 远程调试配置
Jboss,Tomcat 远程调试配置 2007-12-25 15:51:01| 分类: 默认分类|字号 订阅 Eclipse远程调试JBoss应用 修改JBoss启动配置 ...
- 打开窗口进行选择文件(txt文件),打开所选文件,读入文件
用mfc编写项目的时候往往需要调用窗口,允许用户通过窗口进行选择文件操作 TCHAR szBuffer[MAX_PATH] = { 0 }; OPENFILENAME ofn = { 0 }; ofn ...
- JAVA反射机制o
Reflection是Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性.例如,使用它能获得 Java 类中 ...
- 深水划水队项目---七天冲刺之day4
由于有一名队员回家了,所以今天的站立式会议改成微信群线上讨论 工作进度: 1.游戏界面进一步美化中. 2.游戏基本功能已经初步实现. 3.计划今天内商讨出如何实现游戏中的难度选择功能与道具功能. 工作 ...
- Oracle EBS R12多组织访问架构
关于R12的新特性Multi-Org Access Control(MOAC).Oracle宣传的好处主要有:1.enable users to access to secured data in o ...
- java分页实例Demo
前两天测试过的一个分页的demo,在网上看到的,挺好的,就写了下来. 分页也是web里面必须的,有使用的价值. demo文件打包上传了,链接:http://pan.baidu.com/s/1o6sME ...
- SQL Server创建表超出行最大限制解决方法
问题的现象在创建表A的时候,出现“信息 511,级别 16,状态 1,第 5 行 无法创建大小为 的行,该值大于允许的最大值 8060.”的信息提示.很奇怪,网上查了一下,是因为要插入表的数据类型的 ...
- 10-06 Linux的基本命令以及一些简单的通配符说明
Shell的通配符 主要用于模式匹配,如:文件名匹配,路径名搜索,字符查找等.常用的有:'*','?','[]' '*':代表任意长度的字串. '?':代表单个任意字符 '[]':代表模式串匹配的字符 ...
- 使用oracle9的 odbc 连接oracle11
客户机上基于Oracle 9i的ODBC数据源,无法连接oracle 11G数据库,提示错误为:error ORA-01017, Invalid Username / Password.奇怪的是:sq ...
- 接口IDisposable的用法
C#的每一个类型都代表一种资源,而资源又分为两类: 托管资源 由CLR管理分配和释放的资源,即从CLR里new出来的对象. 非托管资源 不受CLR管理的对象,如Windows内核对象,或者文件.数 ...