Bootstrap

面试题之一文搞定js中判断数组的方法

判断数组的方法:

Object.prototype.toString.call(arr)
Object.prototype.toString.call(arr) === "[object Array]"
​
Object.prototype.toString.call(arr).slice(8,-1) === "Array"

这是目前兼容性最好的方法,在es6之前基本都是使用该方法,但有一定缺陷:

let obj = {}
console.log(Object.prototype.toString.call(obj));
​
obj[Symbol.toStringTag] = "Array"
console.log(Object.prototype.toString.call(obj));

代码结果:

image-20240722213549266

通过结果可知,我们可以通过Symbol.toStringTag修改Object.prototype.toString() 的返回值,这样明明obj是一个空对象,结果打印出来的结果显然不准确的。不过这种情况一般不会遇到,平常开发还是可以正常使用的。

原型
arr.__proto__ == Array.prototype
​
arr instanceof Array

该方法有明显缺陷,那就是原型链容易被修改,从而导致该方法判断失误:

let obj = {}
console.log(obj instanceof Array);
obj.__proto__ =Array.prototype
console.log(obj instanceof Array);

代码结果:

image-20240722214641353

Array.isArray
Array.isArray(arr)

该方法是es6新增的内置数组方法,它的实现原理是通过判断该对象是否是数组的数据结构,简单来说就是判断该对象是否是通过Array构造函数生成的,该方法无法通过js代码手写出来。

该方法简单且准确,但有一定的兼容性问题(基本可以忽略

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;