Array.from()
Array.from
方法用于將兩類對象轉換成真正的數組
- 類似數組的對象(array-like object)
- 可遍歷(iterable)對象
類似數組的對象(array-like object)
任何有length
屬性的對象,都可以通過Array.from
轉為數組
let arrayLike = {
0: 'a',
1: 'b',
2: 'c',
length: 3
}
Array.from(arrayLike) // ["a", "b", "c"]
可遍歷(iterable)對象
只要部署了Iterator接口的數據結構,Array.form
都能將其轉成數組
Array.from('hello')
// ["h", "e", "l", "l", "o"]
這種用法跟擴展運算法(...)用法一樣,擴展運算法不支持轉化類似數組對象
第二個參數
Array.from
第二個參數,類似數組 map
的用法,用來對每個元素進行處理,將處理后的值放入返回的數組
Array.from(arrayLike, x => x * x)
// 等同于
Array.from(arrayLike).map(x => x * x)
第三個參數
如果
map
函數里用到了this
關鍵字,還可以傳入第三個參數綁定this
其他
Array.from
可以識別各種 Unicode字符,可以避免大于 \uFFFF
的Unicode字符算作兩個字符的錯誤
Array.of()
Array.of
用于將一組值轉換為數組
目的:你不構造函數Array()的不足
Array()
的行為會隨參數的不同而不同,'Array.of' 基本上可以替代Array()
或new Array()
,并且不存在由于參數不同而導致重載
Array.of(1, 2, 3) // [1, 2, 3]
Array(3) // [ , , ,]
Array(1, 2, 3) // [1, 2, 3]
數組示例的find() 和 findIndex()
find()
方法用于找出第一個符合條件的數組成員,他的第一個參數是一個回調函數,所有數組成員一次執行該回調函數,知道找出第一個返回值為true
的成員,沒有則返回undefined
find()
方法的回調函數可以接受3個參數 當前的值,當前的位置,原數組(value,key,array)
find()
可以接受第二個參數,用于綁定回調函數的this對象
findIndex()
與find()
類似,返回的是數組成員的位置
[1, 2, 3, 4, 5].find(value => value === 4) // 4
[1, 2, 3, 4, 5].findIndex(value => value === 4) // 3
find()
和findIndex()
可以用來彌補indexOf()
的不足,因為indexOf()
方法不能識別NaN
,而find()
和findIndex()
可以在回調函數中借助Object.is
方法
[1, 2, NaN, 4, 5].findIndex(value => value == NaN) // 2
數組示例的fill()
fill
方法給數組填充定值,第一個參數為要填充的值,第二個和第三個參數分別為填充起始位置和結束位置
[1, 2, 3].fill(0) // [0, 0, 0]
[1, 2, 3].fill(0, 1, 2) // [1, 0, 3]
數組示例的 entries(),keys(),values()
entries()
,keys()
,values()
用于遍歷數組,它們都返回一個可遍歷對象,可用for ... of
循環遍歷
entries()
是鍵值對的遍歷
keys()
是鍵名的遍歷,數組中為位置
values()
是對鍵值的遍歷
for (let index of[1, 2, 3].keys()) {
console.log(index)
}
// 0
// 1
// 2
數組示例的includes()
includes()
返回一個布爾值,表示數組是否包含給定的值,與字符串的includes()
方法類似
[1, 2, 3].includes(2) // true
indexOf
也可實現類似功能
if(arr.indexOf(el)!==-1){
// ...
}
但indexOf方法有以下缺點:
- 不夠語義化
- 內部使用嚴格相當運算符(===)進行判斷,導致對
NaN
的誤判
數組的空位
數組的空位值數組的某一個位置沒有任何值,如
Array
構造函數返回的數組都是空位
- 空位不是
undefined
, 一個位置等于undefined
依然是有值的,空位沒有任何值- ES5 對空位的處理很不一致,大多數情況會忽略空位
- ES6 明確規定將空位轉為
undefined
// Array.from 會將數組空位轉成 undefined
Array.from([1, , 3]); // [1, undefined, 3]
// 擴展運算符(...)也會將空位轉成 undefined
[...[4, , 6]]; // [4, undefined, 6]
數組推導
數組推導提供簡潔寫法,允許直接通過現有數組生成新數組
數組推導中,for ... of
結構總是寫在最前面,返回表達式寫在最后面,類似與Python
的寫法
該方法為ES7方法
for ... of
后面可以附加if
語句,用于設定循環的條件
在一個數組推導中,還可以使用多個for ... of
結構,構成多重循環
let a1 = [1, 2, 3];
let a2 = [ for (i of a1) i * 2 ];
a2 // [2, 4, 6]
數組推導的方括號構成一個單獨的作用域,其中聲明的對象類似于使用
let
語句聲明的變量
使用數組推導需要注意的地方時:新數組會立即在內存中生成,這是,如果原數組很大,將非常消耗內存