將一個數(shù)組轉(zhuǎn)化為用逗號隔開的序列
console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5 復(fù)制代碼
注意: 1. 如果擴展運算符后面?zhèn)魅胍粋€空數(shù)組,則不產(chǎn)生任何效果
2. 只有函數(shù)調(diào)用的時候擴展運算符才放在圓括號中,否則放在[]中
「賦值數(shù)組」
const a1 = [1, 2]; // 寫法一 const a2 = [...a1]; // 寫法二 const [...a2] = a1; 復(fù)制代碼
「合并數(shù)組」
const arr1 = ['a', 'b']; const arr2 = ['c']; const arr3 = ['d', 'e']; const newArr = [...arr1, ...arr2,...arr3]; console.log(newArr) //['a', 'b','c','d', 'e'] 復(fù)制代碼
「與解構(gòu)賦值結(jié)合」
如果將擴展運算符用于數(shù)組賦值,只能放在參數(shù)的最后一位,否則會報錯。
const [a, ...b] = ['a', 'b','c','d', 'e']; console.log(a) //a console.log(b) //["b", "c", "d", "e"] 復(fù)制代碼
「擴展運算符還可以將字符串轉(zhuǎn)為真正的數(shù)組。」
有一個重要的好處,那就是能夠正確識別四個字節(jié)的 Unicode 字符。
console.log([...'haha']) //["h", "a", "h", "a"] 復(fù)制代碼
用于將類似數(shù)組的對象和可遍歷的對象轉(zhuǎn)化為數(shù)組,
let arrayLike = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
};
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c'] 復(fù)制代碼
所謂類似數(shù)組的對象,本質(zhì)特征只有一點,即必須有l(wèi)ength屬性。因此,任何有l(wèi)ength屬性的對象,都可以通過Array.from方法轉(zhuǎn)為數(shù)組,而擴展運算符就無法轉(zhuǎn)換。 Array.from還可以接受第二個參數(shù),作用類似于數(shù)組的map方法,用來對每個元素進行處理,將處理后的值放入返回的數(shù)組。
Array.from(arrayLike, x => x * x);
// 等同于
Array.from(arrayLike).map(x => x * x);
Array.from([1, 2, 3], (x) => x * x)
// [1, 4, 9] 復(fù)制代碼
Array.of方法用于將一組值,轉(zhuǎn)換為數(shù)組。 Array.of總是返回參數(shù)值組成的數(shù)組。如果沒有參數(shù),就返回一個空數(shù)組
Array() // []
Array(3) // [, , ,]
Array(3, 11, 8) // [3, 11, 8]
Array.of() // []
Array.of(undefined) // [undefined]
Array.of(1) // [1]
Array.of(1, 2) // [1, 2] 復(fù)制代碼
find()用于找出第一個符合條件的數(shù)組成員,然后返回該成員,如果沒有符合條件的元素,則返回undefined;
[1, 4, -5, 10].find((n) => n < 0)
// -5 復(fù)制代碼
findIndex()用于找出第一個符合條件的數(shù)組成員,然后返回該成員的下標(biāo),如果沒有符合條件的成員,則返回-1;
[1, 5, 10, 15].findIndex(function(value, index, arr) {
return value > 9;
}) // 2 復(fù)制代碼
方法使用給定值,填充一個數(shù)組。
['a', 'b', 'c'].fill(7)
// [7, 7, 7]
new Array(3).fill(7)
// [7, 7, 7] 復(fù)制代碼
fill方法還可以接受第二個和第三個參數(shù),用于指定填充的起始位置和結(jié)束位置 ['a', 'b', 'c'].fill(7, 1, 2)
如果填充的類型為對象,那么被賦值的是同一個內(nèi)存地址的對象,而不是深拷貝對象。
唯一的區(qū)別是keys()是對鍵名的遍歷、values()是對鍵值的遍歷,entries()是對鍵值對的遍歷。
const objArr = [
{
name: '張三',
age: 23
},
{
name: '李四',
age: 25
},
{
name: '王五',
age: 26
}
]
for(item of objArr.keys()){
console.log(item)
}
for(item of objArr.values()){
console.log(item)
}
for([index, item] of objArr.entries()){
console.log(index, item)
} 復(fù)制代碼
「Array.prototype.includes(target, start)」
target: 必須參數(shù),給定的值
start: 可選參數(shù),搜索的起始位置,默認是從0開始的,如果是0表示倒數(shù)的位置,如果超過數(shù)組的長度則從0開始搜索 方法返回一個布爾值,表示某個數(shù)組是否包含給定的值
[1, 2, 3].includes(2) // true
[1, 2, 3].includes(4) // false
[1, 2, NaN].includes(NaN) // true
[1, 2, 3].includes(3, 3); // false
[1, 2, 3].includes(3, -1); // true
[NaN].indexOf(NaN) 復(fù)制代碼
數(shù)組的成員有時還是數(shù)組,Array.prototype.flat()用于將嵌套的數(shù)組“拉平”,變成一維的數(shù)組。該方法返回一個新數(shù)組,對原數(shù)據(jù)沒有影響。flat()默認只會“拉平”一層,如果想要“拉平”多層的嵌套數(shù)組,可以將flat()方法的參數(shù)寫成一個整數(shù),表示想要拉平的層數(shù),默認為1。
[1, 2, [3, [4, 5]]].flat()
// [1, 2, 3, [4, 5]]
[1, 2, [3, [4, 5]]].flat(2)
// [1, 2, 3, 4, 5] 復(fù)制代碼
如果不管有多少層嵌套,都要轉(zhuǎn)成一維數(shù)組,可以用Infinity關(guān)鍵字作為參數(shù)。
[1, [2, [3]]].flat(Infinity) // [1, 2, 3] 復(fù)制代碼
如果原數(shù)組有空位,flat()方法會跳過空位
[1, 2, , 4, 5].flat() // [1, 2, 4, 5] 復(fù)制代碼
flatMap()方法對原數(shù)組的每個成員執(zhí)行一個函數(shù)(相當(dāng)于執(zhí)行Array.prototype.map()),然后對返回值組成的數(shù)組執(zhí)行flat()方法。該方法返回一個新數(shù)組,不改變原數(shù)組。
// 相當(dāng)于 [[2, 4], [3, 6], [4, 8]].flat() [2, 3, 4].flatMap((x) => [x, x * 2]) // [2, 4, 3, 6, 4, 8] 復(fù)制代碼
flatMap()只能展開一層數(shù)組。
// 相當(dāng)于 [[[2]], [[4]], [[6]], [[8]]].flat() [1, 2, 3, 4].flatMap(x => [[x * 2]]) // [[2], [4], [6], [8]] 復(fù)制代碼
「遍歷數(shù)組,沒有返回值,不允許在循環(huán)體內(nèi)寫return,不會改變原數(shù)組」
let arr = [11,22,33,44,66] arr.forEach((item,index, arr) =>{ console.log(item, index, arr) }) 復(fù)制代碼
「遍歷數(shù)組 ,返回一個新數(shù)組,不會改變原來的數(shù)組」
let arr = [11,22,33,44,66] let newArr = arr.map((item,index,arr) => { return item*10 }) console.log(newArr) //[110, 220, 330, 440, 660] let newArr2 = arr.map(String); //將數(shù)組的元素變?yōu)镾tring類型 console.log(newArr2) //["11", "22", "33", "44", "66"] let newArr3 = newArr2.map(Number) // 將數(shù)組的元素變?yōu)镹umber類型 console.log(newArr3) //[11, 22, 33, 44, 66] 復(fù)制代碼
「過濾掉數(shù)組中不滿足條件的元素,把滿足條件的元素放到一個新的數(shù)組中,不改變原來的數(shù)組」
let arr4 = arr.filter(item => item%2 === 0); console.log(arr4) //[22, 44, 66] 復(fù)制代碼
「方法接收一個函數(shù)作為累加器,數(shù)組中的每個值(從左到右)開始縮減,最終計算為一個值。」
let array = [1,2,3,4,5]; let temp = array.reduce((prev,cur) => { console.log('prev',cur) console.log('cur', cur) return prev+cur; }) console.log(temp) 復(fù)制代碼
由于傳入了初始值0,所以開始時prev的值為0,cur的值為數(shù)組第一項3,相加之后返回值為3作為下一輪回調(diào)的prev值,然后再繼續(xù)與下一個數(shù)組項相加,以此類推,直至完成所有數(shù)組項的和并返回。
let array = [1,2,3,4,5]; var max = array.reduce((prev,cur)=>{ return Math.max(prev,cur) }) console.log(max) //5 復(fù)制代碼
由于未傳入初始值,所以開始時prev的值為數(shù)組第一項3,cur的值為數(shù)組第二項9,取兩值最大值后繼續(xù)進入下一輪回調(diào)。
var arr = [11,22,33,22,11] var newArr = arr.reduce(function (prev, cur) { prev.indexOf(cur) === -1 && prev.push(cur); return prev; },[]); console.log(newArr) //[11,22,33] 復(fù)制代碼
「遍歷數(shù)組,每一項返滬都是true,則返回true,只要有一個是false,則返回false」
let arr = [11,22,33,44,66] let arr2 = arr.every((item,index,arr) => { return item % 2 === 0 }) console.log(arr2) //false 復(fù)制代碼
「遍歷數(shù)組的元素,只要有一個返回true,就停止循環(huán),返回一個布爾值 不改變原來的數(shù)組
」
let arr = [11,22,33,44,66] let arr3 = arr.some((item,index,arr) => { console.log(index) //0 return item > 1 }) console.log(arr3) // true 復(fù)制代碼
「找到第一個符合條件的數(shù)組元素,就停止遍歷,不改變原來的數(shù)組
」
let arr = [11,22,33,44,66] let arr4 = arr.find((value,index, arr) => { return value % 3 === 0 }) console.log(arr4) //33 復(fù)制代碼
「方法向/從數(shù)組中添加/刪除項目,然后返回被刪除的項目。——改變原來的數(shù)組」
arrayObject.splice(index,howmany,item1,.....,itemX)
let arr = [1,2,3,4,5] let arr2 = arr.splice(2,2) //下標(biāo)從2開始刪除2個元素 console.log(arr) //[1,2,5] console.log(arr2)//[3,4] 復(fù)制代碼
「方法用于連接兩個或多個數(shù)組?!?/span>
arrayObject.concat(arrayX,arrayX,......,arrayX)
arrayX是必須參數(shù),該參數(shù)可以是具體的值,也可以是數(shù)組對象??梢允侨我舛鄠€。
let arr1 = [1,2,3,4,5]; let arr2 = ['aa','bb','cc'] let arr3 = arr1.concat(arr2) console.log(arr3) //[1, 2, 3, 4, 5, "aa", "bb", "cc"] console.log(arr1.concat('qq','ww')) //[1, 2, 3, 4, 5, "qq", "ww"] 復(fù)制代碼
「方法用于把數(shù)組轉(zhuǎn)化為一個字符串,如果不傳參數(shù),字符傳之間默認用逗號隔開,如果傳了參數(shù),以指定的分隔符方式隔開」
「該方法無需傳參,可把數(shù)組轉(zhuǎn)換為字符串,以逗號的方式隔開?!?/span>
let arr1 = [1,2,3,4,5]; var str1 = arr1.join() var str2 = arr1.join('*') console.log(str1) //1,2,3,4,5 console.log(str2) //1*2*3*4*5 let arr3 = ['aa','bb','cc'] var arr4= arr3.toString() //aa,bb,cc 復(fù)制代碼
「pop()方法用于刪除并返回數(shù)組的最后一個元素?!?/span>
「shift() 方法用于把數(shù)組的第一個元素從其中刪除,并返回第一個元素的值。」
pop() 方法將刪除 arrayObject 的最后一個元素,把數(shù)組長度減 1,并且返回它刪除的元素的值。如果數(shù)組已經(jīng)為空,則 pop() 不改變數(shù)組,并返回 undefined 值。
let arr2 = ['aa','bb','cc'] var arr3= arr2.pop() console.log(arr3) // cc console.log(arr2) //(2) ["aa", "bb"] 復(fù)制代碼
「方法可從已有的數(shù)組中返回選定的元素?!?/span>
arrayObject.slice(start,end)
方法 | 描述 |
---|---|
concat() | 連接2個或者更多的數(shù)組,并返回結(jié)果 |
join() | 把數(shù)組的所有元素放入一個字符串中,元素通過指定分分隔符進行分割 |
pop() | 刪除并返回數(shù)組的最后一個元素 |
push() | 向數(shù)組的末尾添加一個或更多元素,并返回新的長度。 |
revere() | 顛倒數(shù)組中元素的順序。 |
shift() | 刪除并返回數(shù)組的第一個元素 |
slice | 從某個已有的數(shù)組返回選定的元素 |
sort | 對數(shù)組的元素進行排序 |
splice() | 刪除元素,并向數(shù)組添加新元素。 |
toSource() | 返回該對象的源代碼。 |
toString() | 把數(shù)組轉(zhuǎn)換為字符串,并返回結(jié)果。 |
toLocaleString() | 把數(shù)組轉(zhuǎn)換為本地數(shù)組,并返回結(jié)果 |
unshift() | 向數(shù)組的開頭添加一個或更多元素,并返回新的長度。 |
valueOf() | 返回數(shù)組對象的原始值 |
Array(100)會生成有100空位的數(shù)組,這個數(shù)組不能使用map(),forEach(),filter()等方法遍歷,因為空位會被跳過,(for of 不會跳過空位),然后使用fill() 方法給數(shù)組填充數(shù)字.
Array(3) // [empty × 100] const arr1 = Array(100).fill(0).map((item, index) =>{ return index}) 復(fù)制代碼
Array.from還可以接受第二個參數(shù),作用類似于數(shù)組的map方法,用來對每個元素進行處理,將處理后的值放入返回的數(shù)組
const arr4 = Array.from(Array(100), (value, key) => key + 1); 復(fù)制代碼
keys()是對鍵名的遍歷
const arr2 = [...Array(100).keys() ] 復(fù)制代碼
這種不推介使用
let arr = [] for(let x of Array(100).keys()){ console.log(x) arr.push(x+1) } console.log(arr) 復(fù)制代碼
let arr1 = new Set([1,2,3,4,3,2,1]); //{1,2,3,4} let arr2 = new Set([3,3,2,66]); //{3,2,66} 復(fù)制代碼 let union = new Set([...arr1, ...arr2]); //Set{1, 2, 3, 4, 66} console.log([...union]) //[1, 2, 3, 4, 66] 復(fù)制代碼
let intersect = new Set([...arr1].filter(x => arr2.has(x))); console.log(intersect) // {2,3} 復(fù)制代碼
(arr1 相對于 arr2 的)差集
let difference = new Set([...arr1].filter(x => !arr2.has(x))); console.log(difference) // {1,4}