第一种,就是通过原型链上的 constructor 来判断:var a = [] a.constructor === Array // true就很简单,其实不加上 === Array 直接使用 a.constructor 就会输出 ƒ Array() { [native code] } 就可以知道是否会是数组了,不过是为了判断嘛,所以还是加上了。第二种,通过 instanceof 来判断:var a = [] a instanceof Array // true这个也很容易,其实其原理就和我上面提到的通过原型链上的 constructor 来判断类似,instanceof 会去检测构造函数的 prototype 属性是否出现在实例对象的原型链上。第三种,通过 isArray 来判断var a = [] Array.isArray(a) // true😄 和 instanceof 一样简单,但 isArray 是优于 instanceof 的。其原因是不同的全局环境(页面、frame)下 Array 构造函数是不同的,使用 instanceof 来判断是否为数组得保证创建数组的 Array 构造函数是同一个才可以。 不过无伤大雅一般都不会出现这种问题,大家知道即可。第四种,通过 Object.prototype.toString 来判断:var a = []; Object.prototype.toString.call(a) === '[object Array]' // true这种就是属于比较花里胡哨的了,用到了 Object.prototype.toString 方法,再使用 call 来指定 this 的指向。虽然他很强,可以判断几乎所有类型,但是我觉得不是很靠谱。 毕竟 instanceof 都可能因为不同全局环境而导致判断出错。让我觉得依赖于原型上的属性和方法都有可能会有问题。现在已经有了 Array.isArray() 了,就不用再考虑再纠结这些问题了,实践中使用它就行了。我们大概知道有过多少种判断数组的方式即可。本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
第一种,就是通过原型链上的
constructor
来判断:就很简单,其实不加上
=== Array
直接使用a.constructor
就会输出ƒ Array() { [native code] }
就可以知道是否会是数组了,不过是为了判断嘛,所以还是加上了。第二种,通过
instanceof
来判断:这个也很容易,其实其原理就和我上面提到的通过原型链上的
constructor
来判断类似,instanceof
会去检测构造函数的prototype
属性是否出现在实例对象的原型链上。第三种,通过
isArray
来判断😄 和
instanceof
一样简单,但isArray
是优于instanceof
的。其原因是不同的全局环境(页面、frame)下 Array 构造函数是不同的,使用instanceof
来判断是否为数组得保证创建数组的 Array 构造函数是同一个才可以。 不过无伤大雅一般都不会出现这种问题,大家知道即可。第四种,通过
Object.prototype.toString
来判断:这种就是属于比较花里胡哨的了,用到了
Object.prototype.toString
方法,再使用call
来指定this
的指向。虽然他很强,可以判断几乎所有类型,但是我觉得不是很靠谱。毕竟
instanceof
都可能因为不同全局环境而导致判断出错。让我觉得依赖于原型上的属性和方法都有可能会有问题。现在已经有了
Array.isArray()
了,就不用再考虑再纠结这些问题了,实践中使用它就行了。我们大概知道有过多少种判断数组的方式即可。