前端面试题 三个判断数组的方法 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
还有与其他的方法 我就不再一一赘述 毕竟今天的主角是上面的那三种
当然面试的时候 我们可能轻松的说出三种
但如果让你说 那三种之间的 优缺点 那我们又怎么说呢 其实 还是不难的 这个时候 面试官应该是在考验我们对他们原理的理解程度 不仅仅是你会用
首先我们得先明白 这三种方法的 原意是啥意思
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段位上不去呢 因为只会一个英雄 呜呜想哭
因为本人 年前辞职了 所以年前和年后都要准备面试了 所以每天都会分享一些面试题 希望年后找到一个好的工作