JavaScript判断一个变量为数组的方法

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则用来改变toStringthis指向。
方法会返回对应的标识符用来标识对象的类型,实例:

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]'

你可能感兴趣的:(JavaScript,前端,JavaScript)