# 數組類型的方法總結
數組是繼承自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
```