# 数组类型的方法总结
数组是继承自Object的原型,typeof Array 返回值为 ‘object’。所以,如果想进一步判断就需要用以下方法:
## **方法一:Array.isArray()**
isArray 判断是不是数组,返回一个布尔值。--该方法判断比较严格
```
var arr = [1,2,3];
console.log(Array.isArray(arr)); //true
```
简单好用,但Array.isArray()是在ES5中提出,可能会存在不支持此方法的情况
## **方法二:Object.prototype.toString.call()**
每一个继承Object的对象都有toString方法,会返回[Object type],其中 type为对象的类型--该方法判断比较严格
```
var arr = [1,2,3];
Object.prototype.toString.call(arr) === '[object Array]' ;// true
```
## **方法三: Array.prototype.isPrototypeOf()**
isPrototypeOf()用于检测一个对象是否存在与另一个对象的原型链上--该方法判断不严谨
语法:`prototypeObj.isPrototypeOf(object)`
```
var arr = [1,2,3];
console.log(Array.prototype.isPrototypeOf(arr)) //true
```
## **方法四: child instanceof Array**
```
var arr = [1,2,3];
console.log(arr instanceof Array) //true
```
总结:
1. Array.isArray 和 Object.prototype.toString.call 这两个判断比较严格
2. Array.prototype.isPrototypeOf 和 instanceof 这两个判断比较松散,比严谨
eg:
```
var obj_1=[1,2,3];
var obj_2 = {};
var obj_3 = {}
obj_2.__proto__ = Array.prototype;
obj_3.__proto__ = obj_1;
console.log(obj_1 instanceof Array) //true
console.log(obj_2 instanceof Array) //true
console.log(obj_3 instanceof Array) //true
console.log(Array.prototype.isPrototypeOf(obj_1)) //true
console.log(Array.prototype.isPrototypeOf(obj_2)) //true
console.log(Array.prototype.isPrototypeOf(obj_3)) //true
console.log(Object.prototype.toString.call(obj_1) === '[object Array]') //true
console.log(Object.prototype.toString.call(obj_2) === '[object Array]') //false
console.log(Object.prototype.toString.call(obj_3) === '[object Array]') //false
console.log(Array.isArray(obj_1)) //true
console.log(Array.isArray(obj_2)) //false
console.log(Array.isArray(obj_3)) //false
```