JavaScript僞數組和數組

僞數組和數組

在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
  • obj[2]輸出’a’,是由於對象就是普通的鍵值對存取數據
  • 而arr[2]輸出’a’ 則不一樣,數組是經過索引來存取數據,arr[2]之因此輸出’a’,是由於數組arr索引2的位置已經存儲了數據
  • obj.length並不具備數組的特性,而且obj沒有保存屬性length,那麼天然就會輸出undefined
  • 而對於數組來講,length是數組的一個內置屬性,數組會根據索引長度來更改length的值
  • 爲何arr.length輸出3,而不是1
    • 在給數組添加元素時,並無按照連續的索引添加,因此致使數組的索引不連續,那麼就致使索引長度大於元素個數

什麼是僞數組

  1. 擁有 length 屬性,其它屬性(索引)爲非負整數(對象中的索引會被當作字符串來處理,這裏你能夠當作是個非負整數串來理解)
  2. 不具備數組所具備的方法

僞數組,就是像數組同樣有 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
  • DOM 對象列表(好比經過 document.getElementsByTags 獲得的列表)
  • jQuery 對象(好比 $("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

  • 真數組能夠使用數組中的方法
  • 僞數組不能夠使用數組中的方法

小結

  • 對象沒有數組 Array.prototype 的屬性值,類型是 Object ,而數組類型是 Array
  • 數組是基於索引的實現, length 會自動更新,而對象是鍵值對
  • 使用對象能夠建立僞數組,僞數組能夠正常使用數組的大部分方法
相關文章
相關標籤/搜索