js中typeof和instanceof的基本用法以及区别

JavaScript 中 typeof 和 instanceof 通常都会用来判断一个变量是否为空,或者是什么类型的。但在具体使用中它们之间还是有区别的:

首先我们来说一下typeof的用法以及需要注意的地方:

typeof 是一个一元运算,放在一个运算数之前,这个运算数可以是任意的基本数据类型,而它的返回值是该运算数所对应的基本数据类型的字符串
这也就是说typeof其实就是判断参数是什么类型的实例,就一个参数,返回值一般只能是如下几个结果:
“number”、“string”、“boolean”、“object”、“function” 和 “undefined”。

运算数为数字 typeof(x) = "number" 

字符串 typeof(x) = "string" 

布尔值 typeof(x) = "boolean" 

对象,数组和null typeof(x) = "object" 

函数 typeof(x) = "function" 

未赋值变量
	var a
 	typeof(a) = "undefined"

同样的我们也可以利用typeof的这一特性来判断一个变量是否存在,如:

var a = 5
if(typeof a! = "undefined"){
		alert("ok")         //因为我们定义变量a为5,即变量a为一个Number类型,所以输出结果为 'ok'
	}else{
		alert('no')
	}

而不要去使用 if(a) 因为如果 a 不存在(未声明)则会出错,对于 Array,Null 等特殊对象使用 typeof 一律返回 object,这正是 typeof 的局限性。
在这里插入图片描述

综合我们可以看出,在JavaScript 中,通常我们会用 typeof 运算符来判断一个变量是什么类型的数据,但是如果我们希望获取一个对象是否是数组,或判断某个变量是否是某个对象的实例则要选择使用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。

instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。

我们先通过一段代码简单了解一下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

以上,我们应该看到了一些typeof与instanceof的不同之处,从直观的返回值上来看,instanceof 的返回值是一个布尔值,当然了这也正符合了instanceof的描述:
instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。
另外,更重的一点是 instanceof 可以在继承关系中用来判断一个实例是否属于它的父类型。例如:

function Foo(){} 
Foo.prototype = new Aoo()   //JavaScript 原型继承 
var foo = new Foo();
console.log(foo instanceof Foo)   //true 
console.log(foo instanceof Aoo)   //true

上面的代码中是判断了一层继承关系中的父类,在多层继承关系中,instanceof 运算符同样适用。

谈到 instanceof 我们要多插入一个问题,就是 function 的 arguments,我们大家也许都认为 arguments 是一个 Array,但如果使用 instaceof 去测试会发现 arguments 不是一个 Array 对象,尽管看起来很像,这里留给大家进行测试。

最后我们来看下面一段代码:

var a=new Array();
if (a instanceof Object){
		alert('Y')			//这里输出结果为'Y'
	}else{
		alert('N')      
	}

if (window instanceof Object){ 
		alert('Y')
	}else {
		alert('N')			//这里输出结果为'N'
	}

看到这里大家应该明白了,这里的 instanceof 测试的 object 是指 js 语法中的 object,不是指 dom 模型对象。如果这里使用 typeof则会有些区别
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/hcx0805/article/details/83315037