JS中如何判断一个对象是否为数组?

JS中如何判断一个对象是否为数组?

为什么要判断一个对象是否为数组呢?

首先,我们应该都知道typeof操作符对于一些常用类型的判断是非常轻松简便的,但是当它遇到null类型和Array对象这两个时,都会被判断为object
例:

console.log(typeof null); // object

console.log(typeof [1,2,3]); // object

console.log(typeof '这是一段字符串'); // string

console.log(typeof 1); // number

console.log(typeof a); // undefined

console.log(typeof undefined); // undefined

console.log(typeof function(){
     
            return  1;
        });// function

从上面的例子我们可以看到,除了Array和null判断为object外,其他的都可以正常判断,因为typeof操作符检测Array的对象不起作用,所以这时我们就要用一些方法对一个对象进行判断,判断它是否为一个数组。

1. 验证原型对象(Array.prototype.isPrototypeOf(obj))

利用isPrototypeOf()方法,判定Array是不是在obj的原型链中,如果是,则返回true,否则false。

console.log(Array.prototype.isPrototypeOf([1,2,3]));//是数组,返回true
console.log(Array.prototype.isPrototypeOf({
     }));//是function类型,返回false

2.用构造函数来验证(obj instanceof Array)

typeof 和 instanceof 的区别在于一个返回的是数据的基本类型,一个返回的是布尔值。
当instanceof判断的是数组时返回true,否则返回false。
例:

console.log('一段字符串' instanceof Arry);//false
console.log([1,2,3] instanceof Arry);//true

上面的方法其实也可以用对象constructor属性,因为在js中每个对象都有constructor属性,这种也常用作判断未知对象的类型。

var obj1 = [1,2,3];
var obj2 = {
     };
console.log(obj1.constructor == Array); //true
console.log(obj2.constructor == Array); //false

3.根据对象的class属性(类属性),跨原型链调用toString()方法。(Object.prototype.toString )

因为在js中一个对象一旦被创建,在内部会携带创建对象的类型名,一旦创建就不能被修改了。而js中提供了,调用对象原型中的toString方法, Object.prototype.toString.call(obj);因为数组原型中继承的toString()方法被重写了,为了能够调用正确的toString()版本,也就是最原始的版本。可以使用Function.call()的方法,其中call可以这么理解,相当于obj去借用这个 Object.prototype.toString();
例:

console.log(Object.prototype.toString.call([1,2,3]) === "[object Array]");//true
console.log(Object.prototype.toString.call({
     }) === "[object Array]");//false

4.Array.isArray()方法。(ES5中的新增方法)

ECMAScript5将Array.isArray()正式引入JavaScript,目的就是准确地检测一个值是否为数组。
例:

console.log(Array.isArray([]));//true
console.log(Array.isArray({
     }));//false

以上就是比较方便的去判断一个对象是否为数组的四种方法。

你可能感兴趣的:(js基础,javascript)