JavaScript 的Array
對象是用於構造數組的全局對象,數組是相似於列表的高階對象。
javascript
數組內存放的能夠是任意類型的數據。java
let arr1 = [1, { a: 1 }, 'b', [22, 11], true];
let arr2 = new Array(1, { a: 1 }, 'b', [22, 11], true);
let arr3 = Array(1, { a: 1 }, 'b', [22, 11], true);
// 建立指定長度的空數組
let arr4 = new Array(3); // 長度爲3的空數組 [ <3 empty slots> ]
let arr4 = Array(3); // 效果同上
複製代碼
獲取數組成員的方式:[]
運算。
算法
let arr = [1, { a: 1 }, 'b', [22, 11], true];
console.log(arr[1]); // { a: 1 }
arr[0] = 100;
console.log(arr); // [100, { a: 1 }, 'b', [22, 11], true]
複製代碼
Object
是Array
的基類,和Object
同樣,數組也是引用類型的數據。因此簡單的賦值並不能複製數組,只是單純的把"指針"複製給新的變量。看以下例子:數組
let arr = [1, 2, 3];
let arr2 = arr;
arr2[1] = 200;
console.log(arr); // [ 1, 200, 3 ]複製代碼
能夠看出,arr2
的修改也會對arr
形成影響,其緣由是二者指向是同一個對象。要想二者互不影響,必須使用"深拷貝"。(看另外一篇文章講述深拷貝)
函數
添加/刪除數組成員的方法有幾個,能夠從任意位置操做任意多個的成員,且都會改變數組的長度。下面介紹最簡單的從數組尾部添加/刪除。post
let arr = [1, 2, 3];
arr.pop();
console.log(arr); // [ 1, 2 ]
arr.push(100);
console.log(arr); // [ 1, 2, 100 ]複製代碼
還有一種"特別的"刪除成員方法,就是使用delete
運算符,但不會改變數組長度,只會把成員變爲"空":測試
let arr = [1, 2, 3];
delete arr[0];
console.log(arr); // [ <1 empty slot>, 2, 3 ]複製代碼
目前經常使用的屬性就一個:length
。用於獲取數組的長度。
ui
這些方法都是對數組的增刪改查。其中"增"、"刪"、"改"都會改變原數組。this
// 【fill】
let arr2 = Array(3).fill('a');
console.log(arr2); // [ 'a', 'a', 'a' ]
複製代碼
start
表示修改開始的索引值,負數表示末尾開始;deleteCount
表示移除的個數,可選,非負整數,超出邊界取邊界值;item1, item2, ...
表示要添加的元素,省略則只刪除。compareFunction
表示規定排序規則的函數,接收兩個參數:currentEl
當前元素,nextEl
下一個元素。compareFunction
返回 -1 表示currentEl < nextEl
;返回 0 表示currentEl = nextEl
;返回 1 表示currentEl < nextEl
。// 【sort】
let arr = [ 'b', 'a', 4, 3, 2, 1 ]
arr.sort((a, b) => {
return a - b
})
console.log(arr); // [ 'b', 'a', 1, 2, 3, 4 ]
複製代碼
searchElement
表示要查找的元素;fromIndex
表示開始查找的索引值,能夠爲負數,表示從末尾開始。indexOf()
相似,只是從末尾開始,很少介紹。 正常狀況下,遍歷都不會修改原數組,除非你利用索引值對原數組進行修改。方法內傳入的callback
表示回調函數,該回調函數可傳入三個參數,分別是:當前值value
,當前索引值index
,調用該方法的整個數組array
。thisArg
則表示執行callback
時做爲this
對象的值。spa
callback
函數的第一個元素的值。不然返回undefined
。find()
相似,只是返回的是索引值。若是不存在,則返回 -1 。callback
爲條件過濾數組。即對數組每一個元素執行一次callback
,返回以callback
返回值爲true
的元素組成的新數組,全部元素的callback
都是false
則返回[]
。callback
函數,無返回值。callback
函數,返回以callback
的返回值所組成的新數組。callback
函數每次返回的值進行特定的運算,直到把數組全部元素"累積"成一個值。和上面的方法不同,callback
接收的參數有四個:accumulator
表示上一次調用回調時返回的累積值,初始值等於initialValue
;currentValue
表示正在處理的元素;currentIndex
表示正在處理的元素的索引值,可選;array
表示調用該方法的數組。initialValue
表示計算的初始值,可選。reduce()
相似,只是從右邊開始,很少介紹。let arr = [1, 2, 3, 4, 5];
// 【filter】
let result1 = arr.filter(value => {
return value > 2
});
console.log(result1); // [ 3, 4, 5 ]
// 【reduce】
let result2 = arr.reduce((sum, current) => {
return sum += current
}, 15);
console.log(result2); // 30
複製代碼
返回的結果都是布爾值,表示是否含有特定值或知足特定的條件。callback
函數接受的參數參照上面的"遍歷"。
callback
函數的測試。callback
函數的測試。valueToFind
表示要查找的元素,fromIndex
表示開始查找的索引值,默認爲 0 ,能夠爲負數,表示從末尾開始。// 【every】
let arr = [1, 2, 3, 4];
let result = arr.every((value) => {
return value > 1
});
console.log(result); // false
複製代碼
Array Iterator
對象,該對象包含數組中每一個索引的鍵/值對。Array Iterator
對象,該對象包含數組中每一個索引值。(對於數組,該方法實用性不大)Array Iterator
對象,該對象包含數組中每一個值。// 【entries】
let arr = ['a', 'b', 'c'];
let iterator1 = array1.entries();
console.log(iterator1.next().value); // [0, "a"]
console.log(iterator1.next().value); // [1, "b"]
複製代碼
如下方法都是返回新數組,不會改變原數組。
valueN
表示將數組和/或值鏈接成新數組。begin
到end
(不包括end)的淺拷貝到一個新數組,返回新數組。begin
和end
都是索引值,均可以是負數,表示從末尾開始,若值超過數組邊界,取邊界值。depth
指定要提取嵌套數組的結構深度,默認值爲 1。按照一個可指定的深度遞歸遍歷數組,並將全部元素與遍歷到的子數組中的元素合併爲一個新數組返回。簡單說就是把多維數組平鋪,返回新數組,原數組不變。// 【concat】
let arr = [1, 2, 3, 4];
let newArr = arr.concat([11, 22], 33);
console.log(newArr); // [ 1, 2, 3, 4, 11, 22, 33 ]
// 【flat】
let arr = [1, [2, 3], [4, [5, 6], 7], 8]
let result4 = arr.flat(1);
let result5 = arr.flat(2);
console.log(result4); // [ 1, 2, 3, 4, [5, 6], 7, 8 ]
console.log(result5); // [ 1, 2, 3, 4, 5, 6, 7, 8 ]複製代碼
separator
表示分隔符,默認爲",
"。目前靜態方法有三個:
arguments
對象就是一個類數組,Array.from(arguments)
能夠獲得一個數組對象。arrayLike
表示要轉換成數組的僞數組對象或可迭代對象;mapFn
表示新數組中的每一個元素會執行該回調函數,可選;thisArg
表示執行回調函數mapFn
時this
對象,可選。 Array
構造函數相似,二者惟一差異在於參數爲單個整數,Array
構造函數獲得的是指定長度的空數組,而Array.of()
獲得的是包含該數字的一個數組。target
的值是不是一個Array
。返回布爾值。這部份內容在另外一篇文章有介紹。
前面介紹到reduce()
能夠將數組的成員以特定的方法"累積"成特定的值。
加入數組存放的不是"值",而是"方法",數組就能夠做爲一個"方法棧",把某個值通過"方法棧"後獲得計算結果。例子以下:
let funcStack = [
n => n + 2,
n => n ** 3,
n => n * 8
]
let input = 0,
result = funcStack.reduce((computed, fn) => {
return fn(computed);
}, input);
// ((0 + 2) ^ 3) * 8 = 64
console.log(result); // 64複製代碼
輸入值input
依次經歷了三個數學運算,獲得最終的結果。