无论是工作还是面试,都会遇到判断一个数据是否为数组的需求。今天我们就来总结一下判断一个数组有多少种方法,看看哪种方法最好最靠谱。光谱。我们可以从三个角度来判断:构造函数、原型对象、Object的原型对象!根据构造函数判断instanceof,判断一个实例是否属于某个构造函数在实例的原型链上,另一方面,如果实例的原型链发生变化,则无法做出正确的判断。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根据原型对象判断protoproto实例的proto指向构造函数的原型对象让arr=[]控制台。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缺点:根据Object的原型对象判断Object.prototype.toString.call()。Object的原型对象上有一个toString方法,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香!希望今天的文章能帮到你,觉得有用记得点个赞哦~
