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的类型是objectArray的类型也是object,如果我们用typeof将无法区分出nullArray和通常意义上的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。

原文地址:https://www.cnblogs.com/pfr-blog/p/6822661.html