將一個數組變爲參數序列;可與正常的函數參數結合使用;擴展運算符後面也能夠放表達式;若是擴展運算符後面是空數組,不產生任何效果。只有函數調用時,擴展運算符才能夠放到圓括號裏。node
const array1 = [];
const array2 = [];
const arr = [1,2,3];
function push(array,...items){
array.push(...items);
console.log(...(items+'1')); // 1 , 2 , 3 1
}
push(array1,...arr);
push(array2,...[]);
array1 // [1,2,3]
array2 //[]
複製代碼
apply方法的第二個參數把數組轉換爲函數的參數,有了擴展運算符,能夠替代apply的這個做用es6
function f(x, y, z) {
// ...
}
// ES5 的寫法
var args = [0, 1, 2];
f.apply(null, args);
// ES6的寫法
let args = [0, 1, 2];
f(...args);
複製代碼
數組是複合數據類型,直接複製只是複製了數組的地址,沒有從新建立一個數組。擴展運算符能夠提供複製數組的簡便方法。若是數組成員是對象,只能複製對象的引用,若是修改了新數組成員,會同步反映到原數組(淺拷貝)數組
const a1 = [1, 2];
const a2 = a1;
// 只複製了a1的地址
a2[0] = 2;
a1 // [2, 2]
// ES5
const a2 = a1.concat();
a2[0] = 2;
a1 // [1, 2]
// 擴展運算符方法
const a2 = [...a1]; // 寫法一
const [...a2] = a1; // 寫法二
複製代碼
提供了數組合並的新寫法bash
const arr1 = ['a', 'b'];
const arr2 = ['c'];
const arr3 = ['d', 'e'];
// ES5 的合併數組
arr1.concat(arr2, arr3);
// [ 'a', 'b', 'c', 'd', 'e' ]
// ES6 的合併數組
[...arr1, ...arr2, ...arr3]
// [ 'a', 'b', 'c', 'd', 'e' ]
複製代碼
擴展運算符能夠與解構賦值結合生成數組,只能把擴展運算符,會報錯數據結構
const [first, ...rest] = [1, 2, 3, 4, 5];
first // 1
rest // [2, 3, 4, 5]
const [first, ...middle, last] = [1, 2, 3, 4, 5];
// 報錯
複製代碼
[...'hello']
// [ "h", "e", "l", "l", "o" ]
複製代碼
let nodeList = document.querySelectorAll('div');
let array = [...nodeList];
let arrayLike = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
};
// 沒有部署Iterator接口的相似數組的對象
// TypeError: Cannot spread non-iterable object.
let arr = [...arrayLike];
複製代碼
擴展運算符背後調用的是遍歷器接口app
// map結構
let map = new Map([
[1, 'one'],
[2, 'two'],
[3, 'three'],
]);
let arr = [...map.keys()]; // [1, 2, 3]
// generator
const go = function*(){
yield 1;
yield 2;
yield 3;
};
[...go()] // [1, 2, 3]
複製代碼
用於將相似數組的對象和可遍歷的對象轉爲真正的數組。==對象裏必須有length屬性==,任何有length屬性對對象均可以經過Array.from()轉爲數組。擴展運算符也能夠將某些數據結構轉爲數組。ide
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']
Array.from({ length: 3 });
// [ undefined, undefined, undefined ]
複製代碼
Array.from()還能夠接受第二個參數,做用相似數組的map方法,用來對每一個元素進行處理,處理後放入數組。函數
Array.from([1, 2, 3], (x) => x * x)
// [1, 4, 9]
複製代碼
將一組值轉爲數組,這個函數主要爲了彌補構造函數Array()由於參數個數不一樣,致使Array()行爲有差別的不足。測試
Array() // []
Array(3) // [, , ,]
Array(3, 11, 8) // [3, 11, 8]
Array.of() // []
Array.of(undefined) // [undefined]
Array.of(3) // [3]
Array.of(1, 2) // [1, 2]
複製代碼
把當前數組內部指定位置的成員複製到其餘位置(會覆蓋原有成員),而後返回當前數組。能夠修改當前數組。ui
參數:
// 將3號位複製到0號位
[1, 2, 3, 4, 5].copyWithin(0, 3, 4)
// [4, 2, 3, 4, 5]
// -2至關於3號位,-1至關於4號位
[1, 2, 3, 4, 5].copyWithin(0, -2, -1)
// [4, 2, 3, 4, 5]
// 將3號位複製到0號位
[].copyWithin.call({length: 5, 3: 1}, 0, 3)
// {0: 1, 3: 1, length: 5}
// 將2號位到數組結束,複製到0號位
let i32a = new Int32Array([1, 2, 3, 4, 5]);
i32a.copyWithin(0, 2);
// Int32Array [3, 4, 5, 4, 5]
複製代碼
1.find方法:用於找出第一個符合條件的數組成員。參數是一個回調函數,全部數組成員依次執行該回調函數,知道找到第一個返回值爲true的成員,而後返回該成員。find方法的回調參數能夠接受三個參數,依次爲當前值、當前位置和原數組。
[1, 5, 10, 15].find(function(value, index, arr) {
return value > 9;
}) // 10
複製代碼
2.findIndex方法:和find相似,返回符合條件的成員位置。
這兩個方法能夠接受第二個參數,用來綁定回調函數的this對象。
function f(v){
return v > this.age;
}
let person = {name: 'John', age: 20};
[10, 12, 26, 15].find(f, person); // 26
複製代碼
能夠發現NaN,彌補了indexOf方法的不足。
[NaN].indexOf(NaN)
// -1
[NaN].findIndex(y => Object.is(NaN, y))
// 0
複製代碼
使用給定值,填充數組
參數:
若是參數只有第一個,會把數組全部元素覆蓋,適合用於給空數組賦初值。
['a', 'b', 'c'].fill(7, 1, 2)
// ['a', 7, 'c']
['a', 'b', 'c'].fill(7)
// [7, 7, 7]
複製代碼
console.log(...['a','b','c'].keys()); // 0 1 2
console.log(...['a','b','c'].values()); // a b c
console.log(...['a','b','c'].entries()); // [ 0, 'a' ] [ 1, 'b' ] [ 2, 'c' ]
複製代碼
// for...of
for (let elem of ['a', 'b','c'].entries()) {
console.log(elem);
}
// 遍歷器
let letter = ['a', 'b', 'c'];
let entries = letter.entries();
console.log(entries.next().value); // [0, 'a']
console.log(entries.next().value); // [1, 'b']
console.log(entries.next().value); // [2, 'c']
複製代碼
表示數組是否包含給定的值。
參數:
[1, 2, 3].includes(3, 3); // false
[1, 2, 3].includes(3, -1); // true
[1, 2, 3].includes(3,-4); //true
[1, 2, NaN].includes(NaN); // true
複製代碼
與Map,Set的has方法的區別:
1.flat():用於將嵌套的數組拉平,返回一個一維數組,對原數據沒有影響。參數:depth-指定要提取嵌套數組的結構深度,默認值爲1。若是無論有多少層嵌套,都要轉成一維數組,能夠用Infinity關鍵字做爲參數。若是原數組有空位,flat()方法會跳過空位。
[1, 2, [3, [4, 5]]].flat()
// [1, 2, 3, [4, 5]]
[1, 2, [3, [4, 5]]].flat(2)
// [1, 2, 3, 4, 5]
[1, [2, [3]]].flat(Infinity)
// [1, 2, 3]
複製代碼
2.flatMap():首先使用映射函數映射每一個元素,而後將結果壓縮成一個新數組。
參數:
// 至關於 [[2, 4], [3, 6], [4, 8]].flat()
[2, 3, 4].flatMap((x) => [x, x * 2])
// [2, 4, 3, 6, 4, 8]
// flatMap只能展開一層數組
// 至關於 [[[2]], [[4]], [[6]], [[8]]].flat()
[1, 2, 3, 4].flatMap(x => [[x * 2]])
// [[2], [4], [6], [8]]
複製代碼
數組對空位是指數組對某一位置沒有任何值,空位不是undefined,一個位置值等於undefined仍然是有值。
ES5對空位的處理不一致,大多數狀況忽略空位。ES6明確將空位轉爲undefined。上述ES6新增的數組方法都不會忽略空位。
// entries()
[...[,'a'].entries()] // [[0,undefined], [1,"a"]]
// keys()
[...[,'a'].keys()] // [0,1]
// values()
[...[,'a'].values()] // [undefined,"a"]
// find()
[,'a'].find(x => true) // undefined
// findIndex()
[,'a'].findIndex(x => true) // 0
複製代碼
參數(兩個方法參數一致):
const hasProvider = providerList.some(item => item.providerNumber === providerNumber);
arr2.every((item, index) => item === arr1[index])
複製代碼
建立一個新數組,其包含經過所提供函數實現的測試的全部元素。
參數(兩個方法參數一致):
const newlist = list.filter(item => item.channelNumber === channelNumber);
複製代碼
建立一個新數組,其結果是該數組中的每一個元素都調用一個提供的函數後返回的結果。
參數:
const channelNumberList = channelList.map(item => item.channelNumber)
複製代碼
對數組的每一個元素執行一次提供的函數
參數:
var array1 = ['a', 'b', 'c'];
array1.forEach(function(element) {
console.log(element);
});
複製代碼
參數:elementN-被添加到數組末尾到n個元素(按順序添加)
能夠用來合併兩個數組
var vegetables = ['parsnip', 'potato'];
var moreVegs = ['celery', 'beetroot'];
// 將第二個數組融合進第一個數組
// 至關於 vegetables.push('celery', 'beetroot');
Array.prototype.push.apply(vegetables, moreVegs);
console.log(vegetables);
// ['parsnip', 'potato', 'celery', 'beetroot']
複製代碼
對於空數組使用pop方法,返回undefined。
var arr = ['a', 'b', 'c'];
arr.pop() // 'c'
arr // ['a', 'b']
[].pop() // undefined
複製代碼
var a = ['a', 'b', 'c'];
a.shift() // 'a'
a // ['b', 'c']
複製代碼
push和shift方法結合使用,構成了先進先出的隊列結構。
var a = ['a', 'b', 'c'];
a.unshift('x'); // 4
a // ['x', 'a', 'b', 'c']
複製代碼
var a = [1, 2, 3, 4];
a.join(' ') // '1 2 3 4'
a.join(' | ') // "1 | 2 | 3 | 4"
a.join() // "1,2,3,4"
複製代碼
參數:valueN-將數組和/或值鏈接成新數組
['hello'].concat(['world'])
// ["hello", "world"]
['hello'].concat(['world'], ['!'])
// ["hello", "world", "!"]
[].concat({a: 1}, {b: 2})
// [{ a: 1 }, { b: 2 }]
[2].concat({a: 1})
// [2, {a: 1}]
複製代碼
參數:
1)begin 可選 提取起始處的索引,從該索引開始提取原數組元素,默認爲 0。
若是該參數爲負數,則表示從原數組中的倒數第幾個元素開始提取,slice(-2)表示提取原數組中的倒數第二個元素到最後一個元素(包含最後一個元素)。
若是省略 begin,則 slice 從索引 0 開始。
若是 begin 大於原數組的長度,則會返回空數組。
2)end 可選 提取終止處的索引,在該索引處結束提取原數組元素,默認爲 0。slice 會提取原數組中索引從 begin 到 end。
若是該參數爲負數, 則它表示在原數組中的倒數第幾個元素結束抽取。 slice(-2,-1) 表示抽取了原數組中的倒數第二個元素到最後一個元素(不包含最後一個元素,也就是隻有倒數第二個元素)。
若是 end 被省略,則slice 會一直提取到原數組末尾。
若是 end 大於數組的長度,slice也會一直提取到原數組末尾。
var a = ['a', 'b', 'c'];
a.slice(0) // ["a", "b", "c"]
a.slice(1) // ["b", "c"]
a.slice(1, 2) // ["b"]
a.slice(2, 6) // ["c"]
a.slice() // ["a", "b", "c"]
複製代碼
參數:
1)start-指定修改的開始位置(從0計數)
若是超出了數組的長度,則從數組末尾開始添加內容;
若是是負值,則表示從數組末位開始的第幾位(從-1計數,這意味着-n是倒數第n個元素而且等價於array.length-n);
若是負數的絕對值大於數組的長度,則表示開始位置爲第0位。
2)deleteCount-可選,整數,表示要移除的數組元素的個數。
若是 deleteCount 大於 start 以後的元素的總數,則從 start 後面的元素都將被刪除(含第 start 位)。
若是 deleteCount被省略了,或者它的值大於等於array.length-start(也就是說,若是它大於或者等於start以後的全部元素的數量),那麼start以後數組的全部元素都會被刪除。
若是 deleteCount 是 0 或者負數,則不移除元素。這種狀況下,至少應添加一個新元素。
3)item1, item2, ... 可選
要添加進數組的元素,從start 位置開始。若是不指定,則 splice() 將只刪除數組元素。
var a = ['a', 'b', 'c', 'd', 'e', 'f'];
a.splice(4, 2, 1, 2) // ["e", "f"]
a // ["a", "b", "c", "d", 1, 2]
複製代碼
摘自阮一峯
參考MDN