首页 > 代码库 > javascript typeof 和 instanceof 的区别和联系
javascript typeof 和 instanceof 的区别和联系
JavaScript 中 typeof和instanceof都可以用来判断一个变量是否为空,或者是什么数据类型的。但它们之间还是有区别的:
typeof
typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型。
它返回值是一个字符串,该字符串说明运算数的类型,因此如果想要判断是什么类型则是采用字符串判断的方法(加引号)来判断是否一致。
typeof 一般只能返回的是基本的数据类型,如下几种:
number, boolean, string, function, object, undefined
我们可以使用 typeof 来获取一个变量是否存在,如
if(typeof a!="undefined") { alert("ok") }
而不要去使用 if(a) 因为如果 a 不存在(undefined)则会出错,而对于 Array,Null 等特殊对象使用 typeof 一律则返回 object,这也正是 typeof 的局限性。
typeof应该注意的问题?
使用typeof操作符的时候,如果检测对象是函数,那么操作符返回"function" ,如果检测对象是正则表达式的时候,在Safari和Chrome中使用typeof的时候会错误的返回"function",
而其他的浏览器返回的是object.
instanceof
instanceof主要的目的是检测引用类型,可以判断对象是Array,还是RegExp!,并且instanceof 也可以用来判断一个变量是否是某个对象的实例
(包含检测是否具有继承关系父类子类关系之类的)
举个例子:
var a=new Array(); alert(a instanceof Array);
会返回 true,同时
alert(a instanceof Object);
也会返回 true;这是因为 Array 是 object 的子类。再如:
function test(){}; var a=new test(); alert(a instanceof test);//true alert(a instanceof Function);//false 这个没弄清???
第一个会返回true,这里得注意第二个会返回false。
一个有趣的现象:
var a = function test(){}; alert(a instanceof Function);//true
我觉得这个可能和声明的对象是谁的实例有关系,也有可能和JavaScript的继承机制有关,没研究太明白。
instanceof应该注意的问题?
谈到 instanceof 我们要多插入一个问题,就是 function 的 arguments,我们大家也许都认为 arguments 是一个 Array,但如果使用 instaceof 去测试会发现 arguments 不是一个 Array 对象,尽管看起来很像。还有就是instanceof的语法一定不要写错了 variable instanceof constructor !
其实typeof和instanceof的目的都是检测变量的类型,两个的区别在于typeof一般是检测的是基本数据类型,instanceof主要检测的是引用类型! 还有就是一些另外的细节区别,比如说,在这段代码中
var a=new Array(); if (a instanceof Object) alert(‘Y‘); else alert(‘N‘);
结果得‘Y’,但
if (window instanceof Object) alert(‘Y‘); else alert(‘N‘);
结果得‘N‘。
所以,这里的 instanceof 测试的 object 是指 js 语法中的 object,不是指 dom 模型对象。
而使用 typeof则 会有些区别
alert(typeof(window)) 会得 object。
javascript typeof 和 instanceof 的区别和联系