我们从三个角度来判断:妈妈、爸爸、祖先。根据构造函数判断(mother)instanceof判断一个实例是否属于某个构造函数constructor出现在某个实例的原型链上,如果实例的原型链发生变化,则无法做出正确的判断。letarr=[]arr.__proto__=function(){}console.log(arrinstanceofArray)//false构造函数实例的constructor属性指向构造函数本身。letarr=[]console.log(arr.constructor===Array)//true缺点:如果修改了arr的构造函数,则无法正确判断。letarr=[]arr.constructor=function(){}console.log(arr.constructor===Array)//false根据原型对象判断(dad)__proto__实例的__proto__指向构造函数原型对象letarr=[]console.log(arr.__proto__===Array.prototype)//true缺点:如果修改了实例的原型链,则无法做出正确判断。letarr=[]arr.__proto__=function(){}console.log(arr.__proto__===Array.prototype)//falseObject.getPrototypeOf()对象自己的方法获取一个对象所属的原型对象letarr=[]console.log(Object.getPrototypeOf(arr)===Array.prototype)//true缺点:同上Array.prototype.isPrototypeOf()数组原型对象方法,判断是否为一个原型对象objectletarr=[]console.log(Array.prototype.isPrototypeOf(arr))//true缺点:同一个原型对象判断(ancestor)根据Object的原型对象判断Object.prototype.toString.call()Object的原型对象有一个toString方法,默认被所有对象继承,返回“[objecttype]”字符串。但是这个方法经常被原型链上的同名方法覆盖,需要通过Object.prototype.toString.call()强制调用。letarr=[]console.log(Object.prototype.toString.call(arr)==='[objectArray]')//true这种类型就像胎记一样,出生时刻在身上,所以修改原型chain不会对其产生任何影响。让arr=[]arr.__proto__=function(){}console.log(Object.prototype.toString.call(arr)==='[objectArray]')//trueArray.isArray()Array.isArray()是ES6中新增的方法,专门用于数组类型判断,原理同上。letarr=[]console.log(Array.isArray(arr))//true修改原型链不会对其产生任何影响。letarr=[]arr.__proto__=function(){}console.log(Array.isArray(arr))//true总结以上就是判断是否为数组的常用方法,相信不用多说了吧大家可以看到Array.isArray是最易用最靠谱的,还是ES6香!
