首页 > 专栏 > 前端 > 文章详情
记一次面试:判断数据类型时数组还是对象(typeof constructor toString instanceof) 发布于:2021-06-08 20:53:43   原创发表   查看:43  讨论:0
平时遇到需要判断数据类型的时候第一反应是用typeof() 方法,但是用这种方法来判断是数组还是对象是判断不出来的,比如V4y易塔云建站-模板下载,web开发资源,技术博客
V4y易塔云建站-模板下载,web开发资源,技术博客
判断出的结果都是object类型, 那么有什么办法可以帮助我们来区分这两种类型呢?V4y易塔云建站-模板下载,web开发资源,技术博客
V4y易塔云建站-模板下载,web开发资源,技术博客
方法一:constructorV4y易塔云建站-模板下载,web开发资源,技术博客
V4y易塔云建站-模板下载,web开发资源,技术博客
官方解释是constructor 属性返回对创建此对象的数组函数的引用。官方的解释一般都不是人能看懂的,其实 constructor 原本就是用来进行对象类型判断的,但是还有一个作用就是官方的解释 的意思: 每一个对象实例都可以通过 constrcutor 对象访问它的构造函数V4y易塔云建站-模板下载,web开发资源,技术博客
V4y易塔云建站-模板下载,web开发资源,技术博客
这里就不详细说了,要不又要说构造函数,__proto__,构造函数的prototype属性,原型,原型链,那就扯远了,那么constructor怎么用来判断对象属性呢?V4y易塔云建站-模板下载,web开发资源,技术博客
r如上所示,继续判断该Object类型的constructor属性的指向。V4y易塔云建站-模板下载,web开发资源,技术博客
可以看到,一个打印出来Object(){[native code]},一个打印出来Array(){[native code]}。V4y易塔云建站-模板下载,web开发资源,技术博客
V4y易塔云建站-模板下载,web开发资源,技术博客
方法二:instanceofV4y易塔云建站-模板下载,web开发资源,技术博客
 

根据返回的布尔值来判断;V4y易塔云建站-模板下载,web开发资源,技术博客

我个人理解instanceof意思是  A原型链上有没有B原型;V4y易塔云建站-模板下载,web开发资源,技术博客
V4y易塔云建站-模板下载,web开发资源,技术博客
 V4y易塔云建站-模板下载,web开发资源,技术博客

B是A实例对象,所以B的原型链的上一级就是A,所以B instanceof A == true; 而Object属于原型链上的顶点,之后是null;V4y易塔云建站-模板下载,web开发资源,技术博客

所以 A instanceof Object == true;   B instanceof Object  == true; V4y易塔云建站-模板下载,web开发资源,技术博客
V4y易塔云建站-模板下载,web开发资源,技术博客
V4y易塔云建站-模板下载,web开发资源,技术博客
但是这里出了一个问题:可以看到 obj instanceof Array == false,而arr instanceof Object == true。所以instanceof这个方法也不好进行判断。V4y易塔云建站-模板下载,web开发资源,技术博客
V4y易塔云建站-模板下载,web开发资源,技术博客
方法三:toString()V4y易塔云建站-模板下载,web开发资源,技术博客
V4y易塔云建站-模板下载,web开发资源,技术博客
Object.prototype里面有个toString()方法V4y易塔云建站-模板下载,web开发资源,技术博客
V4y易塔云建站-模板下载,web开发资源,技术博客
Object.prototype.toString = function(){V4y易塔云建站-模板下载,web开发资源,技术博客
     在函数里this正常指向的就是调用这个函数的对象, js中call()方法是改变this的指向, a.call(b),  b替换了aV4y易塔云建站-模板下载,web开发资源,技术博客
V4y易塔云建站-模板下载,web开发资源,技术博客
}V4y易塔云建站-模板下载,web开发资源,技术博客
V4y易塔云建站-模板下载,web开发资源,技术博客
Object.prototype.toString.call([ ]),  [ ]替换了Object.prototype;V4y易塔云建站-模板下载,web开发资源,技术博客
V4y易塔云建站-模板下载,web开发资源,技术博客
可以看到 当call()当中用数组的时候打印出的是Array,  用对象的时候打印出的是Object;V4y易塔云建站-模板下载,web开发资源,技术博客
 V4y易塔云建站-模板下载,web开发资源,技术博客

评论

  • 匿名