1 使用Array.isArray()
方法
最简单的判断是否为Array类型的方法。
var arr = [1, 2];
Array.isArray(arr); // true
2 使用instanceof
判断
instanceof
是可以用来判断一个对象是否是一个构造函数的实例,也可以用来判断一个变量是否是Array的实例,比如:
var arr = [1, 2];
arr instanceof Array // ture
但是这样存在一些问题,如果一个类继承了Array类,那么这个类的所有实例化对象使用instanceof
判断是否为Array的实例都为true,所以使用instanceof
并不一定百分之百准确,比如:
function myFun(){};
// 实现继承Array
var proto = Object.create(Array.prototype);
myFun.prototype = proto;
proto.constructor = myFun;
var obj = new myFun();
obj instanceof Array; // true
在上面的例子可以看到obj虽然就是myFun类的一个实例化对象,但是使用instanceof
判断其为Array的实例。
3 使用constructor
或__proto__
判断
原理:一个类的实例化对象的constructor
指向其构造函数即这个类,而__proto__
则指向其构造函数的原型对象。
因为所有的数组都是Array类的实例化对象,所以可以用constructor
或__proto__
判断,比如:
var arr = [1, 2];
arr.constructor === Array; // true
arr.__proto__ === Array.prototype; // true
4 使用Object.prototype.toString.call()
这种方法即调用Object原型对象上的toString方法。这个方法会返回对象的一个内部属性[[Class]]
,以一个字符串[object type]
为结果,其中type
是对象的类型。而call
则用来改变toString
的this
指向。
方法会返回对应的标识符用来标识对象的类型,实例:
var arr = [1, 2];
Object.prototype.toString.call(arr) === '[object Array]'; // true
// 其他数据类型的判断
var obj = {}
Object.prototype.toString.call(obj); // '[object Object]'
var bool = false;
Object.prototype.toString.call(bool); // '[object Boolean]'
var num = 1;
Object.prototype.toString.call(num); // '[object Number]'
var str = 'a';
Object.prototype.toString.call(str); // '[object String]'
var symbol = Symbol();
Object.prototype.toString.call(symbol); // '[object Symbol]'
Object.prototype.toString.call(null); // '[object Null]'
Object.prototype.toString.call(undefined); // '[object Undefined]'