在JavaScript中,除了5種原始數據類型以外,其餘全部的都是對象,包括函數(Function)。javascript
在說區別以前,須要先提到另一個知識,就是 JavaScript 的原型繼承。
全部 JavaScript 的內置構造函數都是繼承自 Object.prototype
。
在這個前提下,能夠理解爲使用 new Array()
或 []
建立出來的數組對象,都會擁有 Object.prototype
的屬性值。java
var obj = {};// 擁有 Object.prototype 的屬性值 var arr = []; //使用數組直接量建立的數組,因爲 Array.prototype 的屬性繼承自 Object.prototype, //那麼,它將同時擁有 Array.prototype 和 Object.prototype 的屬性值
能夠獲得對象和數組的第一個區別:對象沒有數組 Array.prototype 的屬性值。數組
數組具備一個最基本特徵:索引,這是對象所沒有的,下面來看一段代碼:markdown
var obj = {}; var arr = []; obj[2] = 'a'; arr[2] = 'a'; console.log(obj[2]); // => a console.log(arr[2]); // => a console.log(obj.length); // => undefined console.log(arr.length); // => 3
僞數組,就是像數組同樣有 length
屬性,也有 0、一、二、3
等屬性的對象,看起來就像數組同樣,但不是數組,好比:ide
var fakeArray = { "0": "first", "1": "second", "2": "third", length: 3 }; for (var i = 0; i < fakeArray.length; i++) { console.log(fakeArray[i]); } Array.prototype.join.call(fakeArray,'+');
arguments
document.getElementsByTags
獲得的列表)$("div")
)僞數組是一個 Object,而真實的數組是一個 Array。函數
僞數組存在的意義,是可讓普通的對象也能正常使用數組的不少方法,好比:atom
var arr = Array.prototype.slice.call(arguments); Array.prototype.forEach.call(arguments, function(v) { // 循環arguments對象 }); // push // some // every // filter // map // ...
以上在借用數組的原型方法的時候均可以經過數組直接量來簡化使用:spa
var obj = { 0: 'a', 1: 'b', 2: 'c', length: 3 } ;[].push.call(obj, 'd') console.log([].slice.call(obj)) ;[].forEach.call(obj, function (num, index) { console.log(num) })
1.長度:prototype
2.方法的使用:code