typeof 和instanceof的区别

297 阅读2分钟

前言

早在很久很久以前我就已经接触到这两个词了,有时后也在用,但是就是对其概念比较模糊,很久之后的现在,我决定搞明白它。

1.typeof

检测一个对象的数据类型,能检测并返回的类型有(array,number,function,string,undefined,和object 6种类型),返回值为字符串类型

在这里要说明一下NaN返回的数据类型也是number,但是NaN不等于它本身,所以可以用(typeof x =='number' && x != x)来判断是不是NaN,

像包括{},[],null这三种对象都会返回object类型,要想对这三种类型区分可以使用toString.call(x)这种方式来判断,这种方式返回的是[object Object],[object Array],[object Null]这种方式的字符串,当然其他五种数据类型也可以这么进行判断。

2.instanceof

这个玩意就比较不太好理解了,因为想要理解它,你需要熟悉一下面向对象编程,在面向对象编程里,你需要知道什么叫实例,什么叫类,有了这两个概念就比较好理解了

创建类的方法(es5)

function Parent(){} 说的简单点就是创建一个方法,为了区别一般的方法,这个方法名 一定 要大写

创建一个实例

var a=new Parent() 就是想咱们平常说的new一个对象,就是创建一个类的实例,a就是Parent的实例

那么知道实例了,你一定要知道每个实例都会有一个_proto_属性,这个属性指向了构造它的(构造函数)类,也就是说a 的_proto_指向的是Parent,(相关知识可以去查看面向对象相关)重要的话来了:insatnceof就是用来判断一个实例的指向的。那么a instanceof Parent 结果为true.

多说几句吧

我们都知道 var b=[] ; b instanceof Array 值肯定为true,为啥呢,因为b=[]等价于b=new Array(); b 是Array类的实例,所以b的_proto_指向的就是Array,所以 b instanceof Array 值为true。

结语:

本人才学疏浅,还不是大佬,希望有个人见解的大佬对我不对的地方进行指导,我会积极改进,对我说的不足的地方多多补充,我也会感激不尽,最后我想说一句 js是世界上最好的语言