因為無論是數組還是對象,對於typeof的操作返回值都為object,所以就有了區分數組類型和對象類型的需要:
方一:通過length屬性:一般情況下對象沒有length屬性值,其值為undefiend,而數組的length值為number類型
缺點:非常不實用,當對象的屬性存在length,且其值為number(比如類數組),則該方法失效,不建議使用,看看即可。
*方二:通過instanceof來判斷區分
var arr = [1, 2, 3]; var obj = { name: 'lyl', age: 18, 1: 'name' } console.log(arr instanceof Array); //true console.log(obj instanceof Array); //false
*方三:通過constructor
var arr = [1, 2, 3]; var obj = { name: 'lyl', age: 18, 1: 'name' } console.log(arr.constructor === Array); //true console.log(obj.constructor === Array); //false
*方四:通過toString()方法,數組原型和對象原型定義的toString()方法不同
原理參考:http://www.cnblogs.com/ziyunfei/archive/2012/11/05/2754156.html
var arr = [1, 2, 3]; var obj = { name: 'lyl', age: 18, 1: 'name' } console.log(Object.prototype.toString.call(arr) === '[object Array]'); //true console.log(Object.prototype.toString.call(boj) === '[object Array]'); //false
方五:隨便找一個數組僅有的方法,來判斷數組和對象誰有該方法即可(樣例以sort來舉例)
var arr = [1, 2, 3]; var obj = { name: 'lyl', age: 18, 1: 'name' }
console.log(arr.sort === Array.prototype.sort); //true console.log(obj.sort === Array.prototype.sort); //false
總結:方法應用權重:
優先使用方四toString,因為該方法幾乎無缺陷。
次之可以使用方二instanceof和方三constructor
剩下的方法玩玩即可,不實用
