《JS權威指南》學習筆記(五):數組

數組的讀和寫

數組也是對象,因此通過[]訪問數組元素,實際上就是通過屬性名訪問,[]中的會轉換成字符串當做屬性名來進行訪問。如果[]中的是非負整數(以及和整數想相等的浮點數),則會動態改變數組元素的length屬性;若不是非負整數,則會當做普通的屬性名,且不會改變length值。

稀疏數組

指索引不連續的數組,其length值大於數組元素的個數。使用構造函數創建數組會生成稀疏數組:

var arr = new Array(3);
arr.length; // 3
0 in arr;   // false,數組中沒有元素

當在數組直接量中省略值時也會創建稀疏數組,省略的值其值爲undefined,也會被當做不存在:

var arr = [,,,];
arr.length; // 3
0 in arr; // false
arr[0]; // undefined

但如果顯示地設置元素值爲undefined,則會被當做元素是存在的,此時不能創建稀疏數組:

var arr = [undefined,undefined,undefined];
arr.length; // 3
0 in arr; // true 數組元素存在
arr[0]; // undefined

數組元素的添加和刪除

  • push

    在數組末尾添加元素

  • unshift

    在數組頭部添加元素

  • delete

    刪除某個數組元素,但數組長度不變,數組變成了稀疏數組

  • pop

    刪除尾部元素

  • shift
    刪除頭部元素

數組遍歷

  • for
var keys = Object.keys(arr); //獲取可枚舉的自有屬性
var values = []; //存儲屬性的值

for (var i = 0, len = keys.length; i < len; i++) {
    var key = keys[i];
    values[i] = arr[key];
}

上述方法考慮了數組元素索引不是整數的情況。除此外,如果需要過濾掉null、undefined、不存在的元素(用in檢測),還需作進一步判斷。

  • for in

    可以處理稀疏數組,循環每次將可枚舉的屬性名賦值給循環變量,不存在的索引將不會遍歷到。
    由於該方法會枚舉到繼承的屬性,因此如果想要自有屬性,可以調用方法o.hasOwnProperty()來進行判斷。
    但該方法不能保證遍歷順序,因此如果依賴遍歷的順序,最好使用常規的for循環。

  • forEach(function(x) {})

    ES5提供。按索引的順序將元素值傳遞給x。

ES5提供的數組方法

1. forEach

改變原來的數組,不能直接中止循環。

2. map

map方法會返回一個新數組,因此傳遞給map的函數應該有一個返回值。

3. filter

返回數組元素的子集。傳遞的函數用來進行邏輯判斷,該函數返回布爾值,當返回true時的數組元素會被添加到filter返回的數組中。

4. every和some

用於邏輯判斷。傳入的函數需要返回布爾值。every是所有元素都返回true時,才返回true;而some是隻要有元素返回true則返回true並停止循環。

5. reduce和reduceRight

傳入reduce的第一個參數爲進行化簡操作的函數,該函數的第一個參數爲到目前爲止化簡操作累計的結果,第二個參數爲數組元素;傳入reduce的第二個參數爲初始值,是可選參數,即傳遞給函數(即第一個參數)的初始值。如果沒有傳第二個參數,則傳入的函數的第一個參數和第二個參數依次爲數組的第一、第二個元素。

reduceRight的計算方向是從數組最右邊的一個元素開始。

作爲數組的字符串

可用[]來訪問字符串中的某個字符,比用charAt()更爲簡潔;同時字符串的類似於數組的事實使得通用的數組方法可以應用到字符串上:

var str = "test";
Array.prototype.join.call(str, " "); //t e s t

但需注意字符串是不可更改的,當用數組方法對字符串進行更改時會導致錯誤,但並沒有任何提示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章