es6數組拓展

  1. Array.from()
    該方法用于將類數組或者可遍歷對象轉化成數組
// 正確寫法
obj = {0: 'a', 1: 'b', 2: 'c', length:3}
console.log(Array.from(obj)) // ["a", "b", "c"]
// 改變順序是被支持的
obj = {2: 'a', 1: 'b', 0: 'c', length:3}
console.log(Array.from(obj)) // ["c", "b", "a"]
// 錯誤寫法1
obj = {0: 'a', 1: 'b', 2: 'c'} // 注意這里沒有length屬性
console.log(Array.from(obj)) // []
// 錯誤寫法二
obj = {0: 'a', 1: 'b', 3: 'c', length:3} // 注意這里的key不是連續的
console.log(Array.from(obj)) // ["a", "b", undefined]

分析:對象里必須是連續的key值,并且需要length屬性

// 針對dom對象的類數組
let lists = document.getElementsByTagName('li')
Array.from(lists).forEach(function (list) {
  console.log(list)
})
// 針對arguments
function fn() {
  let args = Array.from(arguments)
}

只要部署了Iterator接口的數據結構都可以用這個轉化成數組,例如字符串

Array.from('hello word') // ["h", "e", "l", "l", "o", " ", "w", "o", "r", "d"]

拓展:

  • 如果參數是一個真正的數組Array.from()會返回一個新的完全一樣的數組
  • 擴展運算符(...)也可以將部分數據結構轉化成數組
// arguments對象
function fn() {
  let args = [...arguments]
}
// dom集合
let lists = document.getElementsByTagName('li')
[...lists].forEach(function (list) {
  console.log(list)
})
  • 兼容寫法
Array.from ? Array.from : obj => [].slice.call(obj)
  • 多個參數

    • 第二個參數,類似于map,將每個元素進行處理,返回處理后的值到新數組
    let obj = {0: 'a', 1: 'b', 2: 'c', length: 3}
    Array.from(obj, param => 'param:' + param) // ["param:a", "param:b",   "param:c"]
    // 等價于
    let obj = {0: 'a', 1: 'b', 2: 'c', length: 3}
    Array.from(obj).map(param => 'param:' + param)
    
    • 第三個參數,用來綁定this
  1. Array.of()
    該方法用于將一組值轉化成數組
Array.of(1,2,3) // [1, 2, 3]
Array.of(undefined) // [undefined]
Array.of(null) // [null]
Array.of(1) // [1]

對比new Array()

new Array(1,2,3) // [1, 2, 3]
new Array(undefined) // [undefined]
new Array(null) // [null]
new Array(1) // [empty × 1]
new Array(6) // [empty × 6]

說明:
Array.of()總是返回參數組成的數組,new Array() 只有一個參數并且參數為數字的時候則會返回有N項的數組,每一項為空

  1. copyWithin()
    在數組內部將指定位置的成員復制到其他位置,會覆蓋原來的成員,返回當前數組(即會改變原數組)
[1, 2, 3, 4].copyWithin(0, 2, 3) // [3, 2, 3, 4]
u=1709716023,1926310656&fm=27&gp=0.jpg

上面的表情代表我對這個結果的反應,一臉懵逼,開始瘋狂搜索,結果,解釋在這里

  • 該方法接收三個參數
    • 第一個target:從這個位置開始替換數據
    • 第二個start:從該位置開始讀取數據,默認為0,負數表示倒數
    • 第三個end:到該位置之前停止讀取數據,默認是數組的長度,負數表示倒數
  • 解析上面的代碼
    從第0個開始替換,第2個開始到第3個結束并且為半閉半開空間即[2, 3),所以應該對應數組里面的“3”;把第0個位置替換成3,則數組變成了[3,2,3,4]

更多嘗試

[1,2, 3,4].copyWithin(0, 2)  // [3, 4, 3, 4]
[1,2,3,4].copyWithin(0) // [1, 2, 3, 4]
[1,2,3,4].copyWithin(0, 2, -2) // [1, 2, 3, 4]
[1,2,3,4].copyWithin(0, 2, 2) // [1, 2, 3, 4] 
[1,2,3,4].copyWithin(0, -2, -1) // [3, 2, 3, 4]
[1,2,3,4].copyWithin(0, -1, -2) // [1, 2, 3, 4]
  1. find()
    找出數組內第一個符合條件的成員
[1, 2, 3].find((n) => {return n % 2 === 0}) // 2
[1, 2, 3, 4].find((n) => {return n % 2 === 0}) // 2

說明:find方法接受一個參數function,數組成員會依次執行,直到找到條件符合的,如果都不符合則返回undefined。

拓展

  • 更多參數:
    第二個參數用來綁定回調函數的this
  • NaN
    [NaN].find((n) => {return n === NaN}) // undefined
    [NaN].find((n) => {return Object.is(NaN, n)})
  1. findIndex()
    用來返回數組第一個符合條件成員的位置,該方法接受三個參數:value當前的值;index當前的位置;array原數組
[1, 2, 3, 4].findIndex((value, index, array) => {return value % 2 === 0}) // 1
  1. fill()
    使用給定值填充數組(原來的元素會全部被抹掉)
[1, 2, 3].fill('a') // ["a", "a", "a"]

更多參數:

  • 第1個參數表示填充內容
  • 第2個參數表示填充的開始位置,包含開始位置
  • 第3個參數表示填充的結束位置,不包含結束位置
[1, 2, 3].fill('a', 0, 1) // ["a", 2, 3]
  1. entries(),keys()和values()
    用來遍歷數組
let arr = ['a', 'b', 'c']
for(let index of arr.keys()) {
  console.log(index)
} // 0, 1, 2
for(let val of arr.values()) {
  console.log(val)
} // 'a', 'b', 'c'
for(let [index, val] of arr.entries()) {
  console.log(index, val)
} // 0 "a" 1 "b" 2 "c"
  1. includes
    返回某個數組是否包含給定的值,返回一個Boolean值
[1, 2, 3].includes(3) // true
[1, 2, 3].includes('2') // false
[1, 2, NaN].includes(NaN) // true

多個參數:

  • 第1個參數表示要查找的值
  • 第2個參數表示搜索的開始位置,默認0,負數表示從后面,超出重置為0

想了解更多數組ES5支持的方法請點擊這里

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

推薦閱讀更多精彩內容