1. 程式人生 > >ES6標準學習: 4、數組的擴展

ES6標準學習: 4、數組的擴展

nts 特征 strong 擁有 find() 條件 fin 位置 fine

數組的擴展

一、類數組對象與可遍歷對象轉換為數組

Array.from()方法用於將類數組對象、可遍歷對象轉換為數組,其中可遍歷對象包括es6新增的set和map結構

所謂的類數組對象,本質特征是必須擁有length屬性

 1 let arrayLikeObj = {
 2   ‘0‘: ‘a‘,
 3   ‘1‘: ‘b‘,
 4   ‘2‘: ‘c‘,
 5   length: 3
 6 }
 7 
 8 ES5轉換為數組: 
 9 let arr = [].slice.call(arrayLikeObj)  // [‘a‘, ‘b‘, ‘c‘]
10 
11 ES6轉換為數組:
12 let arr = Array.from(arrayLikeObj) //
[‘a‘, ‘b‘, ‘c‘]

實際中有哪些類數組對象呢?

1、DOM操作返回的NodeList集合

2、函數的arguments對象

如果參數本事就是一個數組,Array.from會返回一個一模一樣的新數組。

Array.from()還可以接受第二個參數,類似於map方法,用來對每個元素進行處理,將處理後的值放入返回的數組。

Array.from(arrayLikeObj, x => x * x)
// 等同於
Array.from(arrayLikeObj).map(x => x * x)

值得註意的是:如果第二個參數裏面用到了this,還可以傳入第三個參數,用來綁定this

二、一組值轉換為數組

Array.of()用於將一組值轉換為數組

1 Array.of(1, 1, 1) // [1, 1, 1]

這個函數的主要作用是為了彌補Array()構造函數的不足。因為參數的個數會導致Array()的行為有差異。

1 Array() // []
2 Array(3) // [ , , ,]
3 Array(1, 1, 1) // [1, 1, 1]

只有當參數個數不少於2時,Array()才會返回由參數組成的新數組.

Array.of總是返回有參數值組成的數組,如果沒有參數,返回一個空數組。

三、copyWithin()

數組實例的copyWithin方法,在當前數組內部指定位置的成員復制到其他位置(會覆蓋),然後返回當前數組

Array.prototype.copyWithin(target, start, end)

target: 必須參數,從該位置起開始替換數據

start: 可選,從該位置器開始讀取數據,默認為0

end: 可選,到該位置前停止讀取數據,默認等於數組長度

start,end可以為負數,如果為負數,則表示倒數

這三個參數都應該是數值,如果不是數值,會轉換為數值

1 [1,2,3,4,5].copyWithin(0,3)  // [4, 5, 3, 4 ,5]

上面的代碼表示:將從3號位置直到數組結束的成員(4, 5)復制到從0號開始的位置,結果覆蓋了原來的1, 2。

四、find()、findIndex()

find方法用於找出第一個符合條件的數組成員,他的參數是一個回調函數,所有成員依次執行這個回調函數,直到找出第一個返回值為true的成員,然後返回該成員。如果未找到,返回undefined

1 [1, 4, -6, 10].find((value) => value < 0)  // -6
1 [1,5, 10, 15].find(function(value, index, arr)) {
2   return value > 9
3 }  // 10

find的回調函數有三個參數

value: 當前值

index: 當前索引

arr: 原數組

findIndex()方法的用法與find的方法非常類似,返回第一個符合條件的數組成員的位置,如果所有成員都不符合條件,返回-1

[1, 5, 10, 15].findIndex(function(value, index, arr)) {
    return value > 9
}
  // 2

以上兩個函數都可以接受第二個參數,用來綁定回調函數的this

值得一體的是,這兩個方法都可以發現NaN,彌補了indexOf方法的不足

1 [NaN].indexOf(NaN) // -1
2 
3 [NaN].findIndex(v => Object.is(NaN, v)) // 0

五、fill()

fill()方法使用給定的值填充數組

[1, 2, 3].fill(7)  /// [7, 7 ,7]

fill方法可以用於初始化空數組,fill方法還可以接受第二個和第三個參數,用於制定填充的開始位置和結束位置(不包括結束位置)

1 [‘a‘, ‘b‘, ‘c‘].fill(7, 1, 2) // [‘a‘, 7 ,‘c‘]

六、entries(),keys(),values()

es6提供了這三個新方法用於遍歷數組,他們都返回一個遍歷器對象,可以用for ... of 循環遍歷,他們的區別在於:keys()是對鍵名的遍歷,values()是對鍵值的遍歷,entries()是對鍵值對的遍歷

 1 for (let index of [‘a‘, ‘b‘].keys()) {
 2   console.log(index)
 3 }
 4 // 0
 5 // 1
 6 
 7 for (let index of [‘a‘, ‘b‘].values()) {
 8   console.log(index)
 9 }
10 // ‘a‘
11 // ‘b‘
12 
13 for (let [index, ele] of [‘a‘, ‘b‘].entries()) {
14   console.log(index, ele)
15 }
16 // 0 "a"
17 // 1 "b"

七、includes()

Array.prototype.includes()方法返回一個布爾值,表示某個數組是否包含給定的值,與字符串的include方法類似,不過,該方法屬於es7。

1 [1, 2, 3].includes(2)  // true
2 [1, 2, NaN].includes(NaN) // true

該方法的第二個參數表示搜索的起始位置,默認為0。如果第二個參數為負數,則表示從後往前的位置,如果此位置超過數組長度(比如第二個參數為-5,但數組長度只有4),則會重置從0開始

1 [1, 2, 3].includes(3, 3)  // true
2 [1, 2, 3].includes(3, -1) // true

沒有該方法時,我們通常使用indexOf,但是indexOf方法有兩個缺陷:

1、不夠語義化,其含義是找到參數值的第一個出現位置,但是比較的確實是否不等於-1

2、其內部使用===進行判斷,會導致對NaN的不夠準確

1 [NaN].indexOf(NaN) // -1

、數組的空位

數組的空位指數組的某一個位置沒有任何值:

註意,空位並不是undefined,一個位置的值等於undefined仍然是有值的,空位是沒有任何值

1 0 in [undefined]
2 true
3 0 in []
4 false

es5對空位的處理很不一致,大多數情況下會忽略空位:

forEach(), filter(), every(),some()會跳過空位

map()會跳過空位,但會保留這個值

join()和toString()會將空位視為undefined,而undefined和null會被處理成空字符串

 1 [, ‘a‘].forEach((x, i) => console.log(i)) // 1
 2 
 3 [‘a‘, ‘b‘].filter(x => true) // [‘a‘, ‘b‘]
 4 
 5 [, ‘a‘].every(x => x ===‘a‘)  // true
 6 
 7 [, ‘a‘].some(x => x !== ‘a‘) // false
 8 
 9 [, ‘a‘].map(x => 1) // [, 1]
10 
11 [, ‘a‘, undefined, null].join(‘#‘) // ‘#a##‘
12 
13 [, ‘a‘, undefined, null].toString() // ‘,a,,‘

ES6則是明確將空位轉換為undefined

Array.from會將數組的空位轉換為undefined,也就是說,這個方法不會忽略空位

Array.from([‘a‘,,‘b‘]) // [‘a‘, undefined, ‘b‘]

copyWithin() 會將空位一起復制

[,‘a‘,‘b‘,,].copyWithin(2, 0) // [, ‘a‘, ,‘a‘]

for ...of循環也會遍歷空位

let arr = [,,]

for (let index of arr) {

console.log(1)

} // 1 1

ES6標準學習: 4、數組的擴展