數組的擴展

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 語句聲明的變量
使用數組推導需要注意的地方時:新數組會立即在內存中生成,這是,如果原數組很大,將非常消耗內存

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 數組的擴展 1.Array.from() 用于將兩類對象轉換為真正的數組:類似數組的對象和可遍歷的對象(包括es6...
    ningluo閱讀 403評論 0 1
  • 擴展運算符 擴展運算符(spread)是三個點(...)。它好比 rest 參數的逆運算,將一個數組轉為用逗號分隔...
    yujiawei007閱讀 170評論 0 0
  • 1. Array.from() 用于將兩類對象轉為真正的數組。 類似數組的對象(array-like object...
    ForeverYoung20閱讀 277評論 0 1
  • 擴展運算符(...) 基本用法 該運算符作用正好與rest參數作用相反,用于展開數組為參數序列,用逗號分割。 應用...
    秋楓殘紅閱讀 214評論 0 0
  • 歲月 總在傷人之后 悄然離去 回憶 卻在離人心中 難以忘懷 我們總在蒼茫世間,渴望留住僅存的一絲空虛 卻總是發現 ...
    風蕭虎嘯人難笑閱讀 833評論 0 1