前端面试题 三个判断数组的方法 Object.prototype.toString.call([1,2,3]) instanceof ,Array.isArray的区别

如果面试中让你说出 判断数组的三种方法  那上面的三种方法 倒是一个不错的选择

var arr=[1,2,3,4,5,6,7];
        console.log(Object.prototype.toString.call(arr)=="[object Array]");
        console.log(arr instanceof Array);
        console.log(Array.isArray(arr));

最后在屏幕中  会看见 三个true 当然判断数组的方法 可不止这三种 

arr.constructor === Array    //true

console.log(Array.prototype.isPrototypeOf(arr)); // true

还有与其他的方法 我就不再一一赘述 毕竟今天的主角是上面的那三种

当然面试的时候 我们可能轻松的说出三种  

但如果让你说 那三种之间的 优缺点 那我们又怎么说呢 其实 还是不难的 这个时候 面试官应该是在考验我们对他们原理的理解程度  不仅仅是你会用 

首先我们得先明白 这三种方法的 原意是啥意思  

扫描二维码关注公众号,回复: 8708897 查看本文章

1.object.prototype.toString.call(arr)   // 输出 ["object Array"]

每一个继承 Object 的对象都有 toString 方法,如果 toString 方法没有重写的话,会返回 [Object type]

 这种方法 是判断 对象属于object的那种原始数据类型  这个是对象创建之初就携带的 

有人可能有疑问了 为啥 不能 Array.toString(arr)  

虽然大家可能都知道 Array是基于object继承来的  但他继承的是 object对象里面的 toString 方法  其实吧 在object的原型对象里面 还有一个toString方法 我们直接使用 Array.toString()虽然能调用这个方法 但却不是我们想用的那个方法 

同时为了保持上下文 this一致  所以使用call方法 

纳闷的童鞋可以去打印 看看  Object.toString()  和 Object.ptototype.toString()

本人还是很推荐 这种方法的 因为 不管对象怎么变 它的出生之初所带的属性 是洗不掉的 用句人话说就是 血脉这种东西无法改变

优点:这种方法对于所有基本的数据类型都能进行判断,即使是 null和defined

缺点:不能精准判断自定义对象,对于自定义对象只会返回[object Object]

var Student=function(name){

  this.name=name

}

var stu=new Student('xiaohong');

Object.prototype.toString.call(stu)  //输出  [object Object]

Object.prototype.toString.call() 常用于判断浏览器内置对象。 

2.instanceof 首先他只能返回  true和false  

instanceof的作用好像是就是用来检测构造函数上的原型上是否存在于要检测对象得原型链上 

听完之后 不懂嘛意思 再看一遍还是不懂 又看一遍 这说的是人话吗

还是实际的例子 好懂一点

arr instaceof Array    // true  也可以这样说 Array的构造函数的原型在数组对象arr原型链上

如果我换一个 函数对象就会报错了

var  f1=new Function();

f1 instanceof Array   //  Array的原型对象 不f1 的原型链上 就报错 

通俗点讲:就好像 他不在我家的族谱上  我不是有这个对象衍生出来的  我不属于他 

缺点: instanceof 只能用来判断对象类型,原始类型不可以。并且所有对象类型 instanceof Object 都是 true,且不同于其他两种方法的是它不能检测出iframes。

优点:instanceof可以弥补Object.prototype.toString.call()不能判断自定义实例化对象的缺点。

3.Array.isArray    这个就更简单易懂  就是判断 对象属不属于数组  属于es6的语法 

是就是,不是就是不是 

Array.isArray([1,2,3])  //true

Array.isArray('1,2,3')  .//false   

有点就是 很轻松的检测出数组   缺点也是他的优点  只会做这个  

就像我为什么王者,lol段位上不去呢 因为只会一个英雄 呜呜想哭 

 因为本人 年前辞职了  所以年前和年后都要准备面试了  所以每天都会分享一些面试题 希望年后找到一个好的工作

发布了107 篇原创文章 · 获赞 64 · 访问量 6649

猜你喜欢

转载自blog.csdn.net/yunchong_zhao/article/details/103985466