1. join()
功能:
將數(shù)組中的所有元素放入一個字符串望伦。元素是通過指定的分隔符進行分隔的疹启,默認使用’,'號分割葛账,不改變原數(shù)組
演示:
let arr = [1,2,3];
console.log(arr.join()); // 1,2,3
console.log(arr); // [1,2,3]
2. concat()
功能:
用于連接兩個或多個數(shù)組。該方法不會改變現(xiàn)有的數(shù)組皮仁,僅會返回被連接數(shù)組的一個副本
let arr1 = [1,2,3];
let arr2 = [4,5];
let arr3 = arr1.concat(arr2)
console.log(arr1); // 1,2,3
console.log(arr3); // [1,2,3,4,5]
3. push()
功能:
可向數(shù)組的末尾添加一個或多個元素籍琳,并返回新的長度。末尾添加贷祈,返回的是長度趋急,會改變原數(shù)組
let arr1 = [1,2,3];
let arr2 = arr1.push(4);
console.log(arr1); // [1,2,3,4]
console.log(arr2); // 4
push 方法可以一次添加多個元素 push(item1,item2,item3...)
4. pop()
功能:
用于刪除并返回數(shù)組的最后一個元素。返回最后一個元素势誊,會改變原數(shù)組呜达。
let arr = [1,2,3];
console.log(arr.pop()); // 3
console.log(arr); // [1,2]
5. shift()
功能:
用于把數(shù)組的第一個元素從其中刪除,并返回第一個元素的值粟耻。返回第一個元素查近,改變原數(shù)組。
let arr = [1,2,3];
console.log(arr.shift()); // 1
console.log(arr); // [2,3]
6. unshift()
功能;
向數(shù)組的開頭添加一個或更多元素挤忙,并返回新的長度霜威。返回新長度,改變原數(shù)組册烈。
let arr = [1,2,3];
console.log(arr.unshift(3,5)); // 5
console.log(arr); // [3,5,1,2,3]
tip: 該方法可以不傳參數(shù)戈泼, 不傳參數(shù)就是不增加元素
7. slice()
功能;
返回一個新的數(shù)組,包含從 start 到 end (不包括該元素)的 arrayObject 中的元素赏僧。返回選定的元素大猛,該方法不會修改原數(shù)組。
let arr = [1,2,3,4];
console.log(arr.slice(1,3)); // [2,3]
console.log(arr); // [1,2,3,4]
tip: 該方法可以不傳參數(shù)淀零, 不傳參數(shù)就是不增加元素
8. splice()
功能;
可刪除從 index 處開始的零個或多個元素挽绩,并且用參數(shù)列表中聲明的一個或多個值來替換那些被刪除的元素。如果從 arrayObject 中刪除了元素驾中,則返回的是含有被刪除的元素的數(shù)組唉堪。splice() 方法會直接對數(shù)組進行修改模聋。
let arr = [1,2,3,4];
console.log(arr.splice(1,0,6)); // []
console.log(arr); // [1,6,2,3,4]
let arr1=[1,2,3,4]
console.log(arr1.splice(1,2,6)); // [2,3]
console.log(arr1); // [1,6,4]
9. substr()和substring()
功能;
相同點:如果只是寫一個參數(shù),兩者的作用都一樣:都是是截取字符串從當(dāng)前下標(biāo)以后直到字符串最后的字符串片段巨坊。
substr(startIndex);
substring(startIndex);
let str="123456789"
console.log(str.substr(2)) // "3456789"
console.log(str.substring(2)) // "3456789"
不同點:第二個參數(shù)
substr(startIndex,lenth): 第二個參數(shù)是截取字符串的長度(從起始點截取某個長度的字符串)撬槽;
substring(startIndex, endIndex): 第二個參數(shù)是截取字符串最終的下標(biāo) (截取2個位置之間的字符串,‘含頭不含尾’)此改。
let str="123456789"
console.log(str.substr(2,5)) // "34567"
console.log(str.substring(2,5)) // "345"
10. sort 排序
功能:按照 Unicode code 位置排序趾撵,默認升序
var arr1 =['cc','ee','aa','33']
arr1.sort() // ["33", "aa", "cc", "ee"]
let arr = [20,10,2,1,3];
arr.sort();// [1, 10, 2, 20, 3]
arr.sort(function(a,b){
return a-b; //升序
}); //[1, 2, 3, 10, 20]
arr.sort(function(a,b){
return b-a; //降序
}); //[20,10,3,2,1]
11. reverse()
功能:
方法用于顛倒數(shù)組中元素的順序。返回的是顛倒后的數(shù)組共啃,會改變原數(shù)組占调。
let arr = [1,2,3,4];
console.log(arr.reverse()); // [4,3,2,1]
console.log(arr); // [4,3,2,1]
12. indexOf() 和 lastIndexOf()
功能:
都接受兩個參數(shù):查找的值、查找起始位置不存在移剪,返回 -1 究珊;存在,返回位置纵苛。
indexOf 是從前往后查找;
lastIndexOf 是從后往前查找剿涮。
let arr = [1,2,3,4,3,6,3];;
arr.indexOf(3) // 2
arr.lastIndexOf(3) // 6
arr.indexOf(2) // 1
arr.lastIndexOf(2) // 1
arr.indexOf(7) // -1
arr.lastIndexOf(7) // -1
13. every() 和 some()
功能:
every() 判斷數(shù)組中每一項都是否滿足條件,只有所有項都滿足條件攻人,才會返回true取试。
some() 判斷數(shù)組中是否存在滿足條件的項,只要有一項滿足條件怀吻,就會返回true瞬浓。
let arr = [1, 2, 3, 4, 5, 6];
arr.every(x=>x>0);//return true;
arr.every(x=>x>5);//return false;
arr.some(x=>x>5);//return true;
14. filter()
功能:
過濾功能,數(shù)組中的每一項運行給定函數(shù)蓬坡,返回滿足過濾條件組成的數(shù)組猿棉。 接受三個參數(shù)
element 數(shù)組中當(dāng)前正在處理的元素。
index可選 正在處理的元素在數(shù)組中的索引屑咳。
array可選 調(diào)用了 filter 的數(shù)組本身萨赁。
let arr = [1,2,3,4,5,6,3,1];
arr.filter(function(v,i,self){
return self.indexOf(v) == i;
});
//[1, 2, 3, 4, 5, 6]
15. map()
功能:
調(diào)用的數(shù)組的每一個元素傳遞給指定的函數(shù),并返回一個新數(shù)組 ,不修改原數(shù)組。
let arr = [2,3,4,5,6];
let arr1= arr.map(function(x){
return x*x;
});
console.log(arr1); // [4, 9, 16, 25, 36]
console.log(arr); // [2, 3, 4, 5, 6]
16. forEach()
功能:
從頭至尾遍歷數(shù)組芒珠,為每個元素調(diào)用指定函數(shù)
輸入為一個待遍歷函數(shù)操软,函數(shù)的參數(shù)依次為:數(shù)組元素、元素的索引掂林、數(shù)組本身
let arr = [2,3,4,5,6];
let arr1=[];
arr.forEach(function(item){
arr1.push(item)
});
console.log(arr1); // [2,3,4,5,6]
console.log(arr); // [2, 3, 4, 5, 6]
17. reduce() 和 reduceRight()
功能:
reduce() 兩個參數(shù):函數(shù)和遞歸的初始值。從數(shù)組的第一項開始坝橡,逐個遍歷到最后
reduceRight() 從數(shù)組的最后一項開始泻帮,向前遍歷到第一項
//可以用reduce快速求數(shù)組之和
let arr=[1,2,3,4];
arr.reduce(function(a,b){
return a+b;
}); //10
ES6操作數(shù)組的方法
1. find() 和 findIndex()
功能:
find() 傳入一個回調(diào)函數(shù),找到數(shù)組中符合當(dāng)前搜索規(guī)則的第一個元素计寇,返回它锣杂,并且終止搜索脂倦。
findIndex() 傳入一個回調(diào)函數(shù),找到數(shù)組中符合當(dāng)前搜索規(guī)則的第一個元素元莫,返回它的下標(biāo)赖阻,終止搜索。
find方法的回調(diào)函數(shù)可以接受三個參數(shù)踱蠢,依次為當(dāng)前的值火欧、當(dāng)前的位置和原數(shù)組。
let arr=[1,2,3,4];
console.log(arr.find(v => v == 2)) // 2
console.log(arr.findIndex(v => v == 2)) // 1
2. entries()茎截,keys() 和 values()
功能:
相同點: 它們都返回一個遍歷器對象
不同點: 可以用for...of循環(huán)進行遍歷苇侵,唯一的區(qū)別是
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"
3. Array.from()
功能;
Array.from方法用于將兩類對象轉(zhuǎn)為真正的數(shù)組:類似數(shù)組的對象(array-like object)和可遍歷(iterable)的對象(包括 ES6 新增的數(shù)據(jù)結(jié)構(gòu) Set 和 Map)
let arr = new Set(['a','b'])
Array.from(arr) // ['a','b']
3. includes()
功能:
Array.prototype.includes方法返回一個布爾值,表示某個數(shù)組是否包含給定的值撕攒,與字符串的includes方法類似陡鹃。
[1, 2, 3].includes(2) // true
[1, 2, 3].includes(4) // false
[1, 2, NaN].includes(NaN) // true
該方法的第二個參數(shù)表示搜索的起始位置,默認為0抖坪。如果第二個參數(shù)為負數(shù)萍鲸,則表示倒數(shù)的位置,如果這時它大于數(shù)組長度(比如第二個參數(shù)為-4柳击,但數(shù)組長度為3)猿推,則會重置為從0開始。
[1, 2, 3].includes(3, 3); // false
[1, 2, 3].includes(3, -1); // true
4. flat() 和 flatMap()
功能:
數(shù)組的成員有時還是數(shù)組捌肴,Array.prototype.flat()用于將嵌套的數(shù)組“拉平”蹬叭,變成一維的數(shù)組。該方法返回一個新數(shù)組状知,對原數(shù)據(jù)沒有影響秽五。
[1, 2, [3, 4]].flat()
// [1, 2, 3, 4]
flat()默認只會“拉平”一層,如果想要“拉平”多層的嵌套數(shù)組饥悴,可以將flat()方法的參數(shù)寫成一個整數(shù)坦喘,表示想要拉平的層數(shù),默認為1西设。
如果不管有多少層嵌套瓣铣,都要轉(zhuǎn)成一維數(shù)組,可以用Infinity關(guān)鍵字作為參數(shù)贷揽。
[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]
flatMap()方法對原數(shù)組的每個成員執(zhí)行一個函數(shù)(相當(dāng)于執(zhí)行Array.prototype.map())棠笑,然后對返回值組成的數(shù)組執(zhí)行flat()方法。該方法返回一個新數(shù)組禽绪,不改變原數(shù)組蓖救。
flatMap()只能展開一層數(shù)組洪规。
// 相當(dāng)于 [[2, 4], [3, 6], [4, 8]].flat()
[2, 3, 4].flatMap((x) => [x, x * 2])
// [2, 4, 3, 6, 4, 8]
// 相當(dāng)于 [[[2]], [[4]], [[6]], [[8]]].flat()
[1, 2, 3, 4].flatMap(x => [[x * 2]])
// [[2], [4], [6], [8]]
數(shù)組的空位
注意,空位不是undefined循捺,一個位置的值等于undefined斩例,依然是有值的〈娱伲空位是沒有任何值念赶,in運算符可以說明這一點。
0 in [undefined, undefined, undefined] // true
0 in [, , ,] // false
上面代碼說明洋满,第一個數(shù)組的 0 號位置是有值的晶乔,第二個數(shù)組的 0 號位置沒有值珍坊。
ES5 對空位的處理牺勾,已經(jīng)很不一致了,大多數(shù)情況下會忽略空位阵漏。
forEach(), filter(), reduce(), every() 和some()都會跳過空位驻民。
map()會跳過空位,但會保留這個值
join()和toString()會將空位視為undefined履怯,而undefined和null會被處理成空字符串回还。
// forEach方法
[,'a'].forEach((x,i) => console.log(i)); // 1
// filter方法
['a',,'b'].filter(x => true) // ['a','b']
// every方法
[,'a'].every(x => x==='a') // true
// reduce方法
[1,,2].reduce((x,y) => x+y) // 3
// some方法
[,'a'].some(x => x !== 'a') // false
// map方法
[,'a'].map(x => 1) // [,1]
// join方法
[,'a',undefined,null].join('#') // "#a##"
// toString方法
[,'a',undefined,null].toString() // ",a,,"
ES6 則是明確將空位轉(zhuǎn)為undefined。
Array.from方法會將數(shù)組的空位叹洲,轉(zhuǎn)為undefined柠硕,也就是說,這個方法不會忽略空位运提。
Array.from(['a',,'b'])
// [ "a", undefined, "b" ]
擴展運算符(...)也會將空位轉(zhuǎn)為undefined蝗柔。
[...['a',,'b']]
// [ "a", undefined, "b" ]
copyWithin()會連空位一起拷貝。
[,'a','b',,].copyWithin(2,0) // [,"a",,"a"]
fill()會將空位視為正常的數(shù)組位置民泵。
new Array(3).fill('a') // ["a","a","a"]
for...of循環(huán)也會遍歷空位癣丧。
let arr = [, ,];
for (let i of arr) {
console.log(1);
}
// 1
// 1
上面代碼中,數(shù)組arr有兩個空位栈妆,for...of并沒有忽略它們胁编。如果改成map方法遍歷,空位是會跳過的鳞尔。
entries()嬉橙、keys()、values()寥假、find()和findIndex()會將空位處理成undefined市框。
// 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
由于空位的處理規(guī)則非常不統(tǒng)一,所以建議避免出現(xiàn)空位昧旨。