首页 > 代码库 > 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 的区别和联系