javascript typeof 和 instanceof 的区别和联系
JavaScript 中 typeof和instanceof都可以用来判断一个变量是否为空,或者是什么数据类型的。但它们之间还是有区别的:
typeof
typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型。
它返回值是一个字符串,该字符串说明运算数的类型,因此如果想要判断是什么类型则是采用字符串判断的方法(加引号)来判断是否一致。
typeof 一般只能返回的是基本的数据类型,如下几种:
number, boolean, string, function, object, undefined
typeof 123; // 'number'
typeof NaN; // 'number'
typeof 'str'; // 'string'
typeof true; // 'boolean'
typeof undefined; // 'undefined'
typeof Math.abs; // 'function'
typeof null; // 'object'
typeof []; // 'object'
typeof {}; // 'object'
我们可以使用 typeof 来获取一个变量是否存在,如
if(typeof a!="undefined") { alert("ok") }
而不要去使用 if(a) 因为如果 a 不存在(undefined)则会出错,而特别注意null
的类型是object
,Array
的类型也是object
,如果我们用typeof
将无法区分出null
、Array
和通常意义上的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
这跟声明的对象是是什么对象有关系,在第一个例子中,a是new出来的一个test实例,说明了test创建了一个包装对象a,而包装对象实例化出来的是对象类型(这里是test对象),而不是Function类型,而第二个例子则是通过function声明的一个对象,并不是包装对象,因此它自然就继承了Function,是Function类型的实例。
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。