es6數組方法擴充

擴展運算符...

  • 擴展運算符就比如rest運算符的逆運算,將數組轉化用逗號隔開的參數序列
  • 替代函數的apply,見下列例子:
例子1:
// ES5 的寫法
Math.max.apply(null, [14, 3, 77])

// ES6 的寫法
Math.max(...[14, 3, 77])

// 等同於
Math.max(14, 3, 77);

Math.max.call(null,...[14, 3, 77])

例子2:
// ES5的 寫法
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
Array.prototype.push.apply(arr1, arr2);

// ES6 的寫法
let arr1 = [0, 1, 2];
let arr2 = [3, 4, 5];
arr1.push(...arr2);
// 或者
Array.prototype.push.call(arr1, ...arr2);
  • 複製數組,見下列例子 不過都是淺拷貝,使用時注意
// es5
 var arr1 = [1,2];
 var arr2 = arr1.concat();
 //或者,等等方法
 var arr2 = arr1.slice();

//es6
//寫法一
let arr2 = [...arr1];
// 寫法二
let [...a2] = a1;
  • 合併數組,見下列例子:
// es5
let arr1 = [1, 2];
let arr2 = [3, 4];
let arr3=arr1.concat(arr2);

//es6
let arr3=[...arr1, ...arr2];
  • 與解構賦值結合
// ES5
a = list[0], rest = list.slice(1)
// ES6
[a, ...rest] = list
  • 另外注意:擴展運算符用於數組賦值,只能放在參數的最後一位,不然會報錯,見例子:
const [...butLast, last] = [1, 2, 3, 4, 5];
// 報錯

const [first, ...middle, last] = [1, 2, 3, 4, 5];
// 報錯
  • 將字符串轉成數組:
[...'hello']   //  [h, e, l, l, o]

Array.from()將類數組的對象轉成數組

  • 注意必定要是類數組的對象,key爲數組的index,而且最後一項是對象的obj.key()的長度
let arrayLike = {
    '0': 'a',  
    '1': 'b',
    '2': 'c',
    length: 3
};

// ES5的寫法
var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']

// ES6的寫法
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']
  • 常見的類數組的對象有:DOM 操做返回的 NodeList 集合、argument對象,均可以經過該方法轉成數組

*Iterator 接口的數據結構,Array.from都能將其轉爲數組es6

  • 字符串和 Set 結構都具備 Iterator 接口
Array.from('zhan')  // ['z','h','a','n']

let namesSet = new Set(['a', 'b'])
Array.from(namesSet)        //['a', 'b']
  • 擴展運算符(...)也能夠將某些數據結構轉爲數組
  • 擴展運算符背後調用的是遍歷器接口(Symbol.iterator),若是一個對象沒有部署這個接口,就沒法轉換。
// arguments對象
function foo() {
  const args = [...arguments];
}

// NodeList對象
[...document.querySelectorAll('div')]
  • 提供map方法,第二個參數就是相似數組的map方法:
例子一:
let spans = document.querySelectorAll('span.name');

// map()
let names1 = Array.prototype.map.call(spans, s => s.textContent);

// Array.from()
let names2 = Array.from(spans, s => s.textContent)

例子二:
Array.from({ length: 2 }, () => 'jack')
// ['jack', 'jack']

Array.of() 將一組值,轉換爲數組

Array.of(1,2,3)  // [1,2,3]
  • 其實該方法是彌補Array方法
// Array傳入不一樣的參數個數,結果不同
Array() // []
Array(3) // [, , ,]
Array(3, 11, 8) // [3, 11, 8]

數組實例的 copyWithin(target,start,end)

  • Array.prototype.copyWithin(target, start = 0, end = this.length)
  • 它接受三個參數。
    • target(必需):從該位置開始替換數據。若是爲負值,表示倒數。
    • start(可選):從該位置開始讀取數據,默認爲 0。若是爲負值,表示倒數。
    • end(可選):到該位置前中止讀取數據,默認等於數組長度。若是爲負值,表示倒數。
// 從數組的第一個開始替換,截取的替換數據從index爲3開始到結尾,包前不包後
[1, 2, 3, 4, 5].copyWithin(0, 3)

find()、findIndex()

  • 這兩個方法均可以接受第二個參數,用來綁定回調函數的this對象。
例子一:
[1, 4, -5, 10].find((n) => n < 0)

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

例子三:
function f(v){
  return v > this.age;
}
let person = {name: 'John', age: 20};
[10, 12, 26, 15].find(f, person);

fill(item,start,end)填充

  • item要填充的值
  • start 從數組的那一個index起始
  • end 結束index
  • start和end能夠省略
['a','b','c'].fill(10) // [10,10,10]
['a','b','c'].fill(10,1,2) // ['a',10,'c']
['a','b','c'].fill(10,1) // ['a',10,10]

entries(),keys() 和 values()

  • keys()是對鍵名的遍歷、values()是對鍵值的遍歷,entries()是對鍵值對的遍歷。
for (let index of ['a', 'b'].keys()) {
  console.log(index);
}
// 0
// 1

for (let elem of ['a', 'b'].values()) {
  console.log(elem);
}
// 'a'
// 'b'

for (let [index, elem] of ['a', 'b'].entries()) {
  console.log(index, elem);
}
// 0 "a"
// 1 "b

includes()

  • Array.prototype.includes方法返回一個布爾值,表示某個數組是否包含給定的值,與字符串的includes方法相似
  • 該方法的第二個參數表示搜索的起始位置
  • indexOf 有兩大缺點:
    1. 不夠語義化
    2. 內部使用===嚴格等於,這會致使對NaN的誤判
[1, 2, 3].includes(2)     // true
[1, 2, 3].includes(4)     // false
[1, 2, NaN].includes(NaN)
[1, 2, 3].includes(2,2)     // false
[NaN].indexOf(NaN)  // -1

數組實例的 flat(),flatMap()

  • 數組的成員有時仍是數組,Array.prototype.flat()用於將嵌套的數組「拉平」,變成一維的數組。該方法返回一個新數組,對原數據沒有影響。
[1, 2, [3, 4]].flat() // [1,2,3,4]
[1, 2, [3, [4, 5]]].flat(2) //[1,2,3,4,5]
//若是無論有多少層嵌套,都要轉成一維數組,能夠用Infinity關鍵字做爲參數
[1, [2, [3]]].flat(Infinity) // [1,2,3]

//flatMap
[2, 3, 4].flatMap((x) => [x, x * 2])  //[2,4,3,6,4,8]

數組的空位

  • 數組的空位指,數組的某一個位置沒有任何值。好比,Array構造函數返回的數組都是空位。
Array(3) // [, , ,]
  • 注意,空位不是undefined,一個位置的值等於undefined,依然是有值的。空位是沒有任何值,in運算符能夠說明這一點
0 in [undefined, undefined, undefined] // true
0 in [, , ,] // false
  • es5中數組的個方法對空位的處理
    • forEach(), filter(), reduce(), every() 和some()都會跳過空位。
    • map()會跳過空位,但會保留這個值
    • join()和toString()會將空位視爲undefined,而undefined和null會被處理成空字符串。
  • ES6 則是明確將空位轉爲undefined
  • 因爲空位的處理規則很是不統一,因此建議避免出現空位。
相關文章
相關標籤/搜索