1、instanceof
2、Array.isArray()
3、Object.prototype.toString.call()
这三种方法都可以用来判断一个给定的变量是否是数组类型。它们之间的区别和优劣如下:
- Object.prototype.toString.call() 每一个继承 Object 的对象都有 toString 方法,如果 toString 方法没有重写的 话,会返回 [Object type],其中 type 为对象的类型。但当除了 Object 类型的
对象外,其他类型直接使用 toString 方法时,会直接返回都是内容的字符串,
所以我们需要使用 call 或者 apply 方法来改变 toString 方法的执行上下文。
const an = ['Hello','An'];an.toString(); // "Hello,An"
Object.prototype.toString.call(an); // "\[object Array]"
//这种方法对于所有基本的数据类型都能进行判断,即使是 null 和 undefined 。
Object.prototype.toString.call('An') // "\[object String]"
Object.prototype.toString.call(1) // "\[object Number]"
Object.prototype.toString.call(Symbol(1)) // "\[object Symbol]"
Object.prototype.toString.call(null) // "\[object Null]"
Object.prototype.toString.call(undefined) // "\[object Undefined]"
Object.prototype.toString.call(function(){}) // "\[object Function]"
Object.prototype.toString.call({name: 'An'}) // "\[object Object]"
Object.prototype.toString.call() 常用于判断浏览器内置对象时。
这种方法会返回一个字符串,表示传入变量的类型。例如,如果传入一个数组,则返回字符串 "[object Array]"。我们只需要截取字符串的第 8 到第 13 个字符,就能得到类型名称 "Array"。
优点:可以准确地判断传入变量是否为数组类型。
缺点:代码有些繁琐,需要使用字符串截取等操作。
2、instanceof
instanceof 的内部机制是通过判断对象的原型链中是不是能找到类型的 prototype。
使用 instanceof 判断一个对象是否为数组,instanceof 会判断这个对象的原型
链上是否会找到对应的 Array 的原型,找到返回 true,否则返回 false。
instanceof Array; // true
// 但 instanceof 只能用来判断对象类型,原始类型不可以。并且所有对象类型
instanceof Object 都是 true。
instanceof Object; // true
这种方法用于判断一个对象是否是另一个对象的实例。如果一个数组是 Array 类型的实例,则返回 true;否则返回 false。
优点:比较简单易懂,代码量较少。
缺点:无法判断基本数据类型,只能用来判断对象类型。
3、Array.isArray()
这种方法是 ES5 新增的一种方法,用来判断一个变量是否为数组类型。
优点:代码简洁明了,易于理解和使用。
缺点:在老版本的浏览器中不支持。
综上所述,这三种方法都可以用于判断一个变量是否为数组类型。如果在现代的浏览器环境下,建议使用 Array.isArray() 方法进行判断。如果需要兼容老版本的浏览器,可以考虑使用 Object.prototype.toString.call() 方法。而 instanceof 方法则主要用于判断对象实例,不太适用于判断数组类型。