因为typeof在判断的时候无法判断一个数据为对象还是数组,返回的值都是Object,所以罗列了以下几种方法
1.instanceof
方法
instanceof
运算符是⽤来测试⼀个对象是否在其原型链原型构造函数的属性
代码:
var arr = [];
arr instanceof Array; //true
注意:想要arr instanceof Array为true,得保证arr是由原始Array构造函数创建时才可行。
2.Object.prototype.toString.call()
这个方法返回一个字符串,例如:
Object.prototype.toString.call( { name: 'aaa' } ) // '[object Object]'
Object.prototype.toString.call( [1, 2, 3, 4] ) // '[object Array]'
Object.prototype.toString.call( 1 ) // '[object Number]'
Object.prototype.toString.call( '1' ) // '[object String]'
···
具体代码:
var isType = function(obj) {
return Object.prototype.toString.call(obj).slice(8,-1);
}
3.ES5 新增⽅法isArray( )
(推荐)
调用是需要加Array
,因为非全局内置函数,而是数组家函数
具体代码:
var a = new Array();
var b = new Date();
console.log(Array.isArray(a)); //true
console.log(Array.isArray(b)); //false
4.constructor
实例的构造函数属性constructor指向构造函数,那么通过contractor属性可以判断是否为一个数组。
let a = [1,2,3];
a.constructor === Array;//true
5.使用方法2与方法3做更好的兼容,自己封装一个判断函数(推荐),针对于ES5之前不支持此方法的问题
function isType(arr) {
if(!Array.isArray) {
Array.isArray = function(arr) {
return Object.prototype.toString.call(arr) === '[object Array]';
}
return Array.isArray(arr);
} else {
return Array.isArray(arr);
}
}