JavaScript陣列方法詳解
JavaScript陣列方法詳解
JavaScript中陣列的方法種類眾多,在ES3-ES7不同版本時期都有新方法;並且陣列的方法還有原型方法和從object繼承的方法,這裡我們只介紹陣列在每個版本中原型上的方法,本文舉例介紹了從ES3到ES7幾乎所有的陣列方法。這大概是最全的陣列方法詳解了。希望讀者能從中有所收穫。
一、各版本陣列方法一覽表
陣列方法名 | 對應版本 | 功能 | 原陣列是否改變 |
---|---|---|---|
pop() | ES3- | 刪除最後一位,並返回刪除的資料 | 是 |
push() | ES3- | 在最後一位新增一或多個數據,返回長度 | 是 |
shift() | ES3- | 刪除第一位,並返回刪除的資料 | 是 |
unshift() | ES3- | 在第一位新增一或多個數據,返回長度 | 是 |
reverse() | ES3- | 反轉陣列,返回結果 | 是 |
sort() | ES3- | 排序(字元規則),返回結果 | 是 |
splice() | ES3- | 刪除指定位置,並替換,返回刪除的資料 | 是 |
copyWithin() | ES6- | 指定位置的成員複製到其他位置 | 是 |
fill() | ES6- | 使用給定的值,填充到陣列中,類似於替換 | 是 |
concat() | ES3- | 合併陣列,並返回合併之後的資料 | 否 |
join() | ES3- | 使用分隔符,將陣列轉為字串並返回 | 否 |
slice() | ES3- | 擷取指定位置的陣列,並返回 | 否 |
toString() | ES3- | 直接轉為字串,並返回 | 否 |
valueOf() | ES5- | 返回陣列物件的原始值 | 否 |
indexOf() | ES5- | 查詢並返回資料的索引 | 否 |
lastIndexOf() | ES5- | 反向查詢並返回資料的索引 | 否 |
forEach() | ES5- | 引數為回撥函式,會遍歷陣列所有的項,回撥函式接受三個引數,分別為value,index,self;forEach沒有返回值 | 否 |
map() | ES5- | 同forEach,同時回撥函式返回資料,組成新陣列由map返回 | 否 |
filter() | ES5- | 同forEach,同時回撥函式返回布林值,為true的資料組成新陣列由filter返回 | 否 |
every() | ES5- | 同forEach,同時回撥函式返回布林值,全部為true,由every返回true | 否 |
some() | ES5- | 同forEach,同時回撥函式返回布林值,只要有一個為true,由some返回true | 否 |
reduce() | ES5- | 歸併,同forEach,迭代陣列的所有項,並構建一個最終值,由reduce返回 | 否 |
reduceRight() | ES5- | 反向歸併,同forEach,迭代陣列的所有項,並構建一個最終值,由reduceRight返回 | 否 |
from() | ES6- | 將類陣列物件和可遍歷物件轉化為陣列 | 否 |
of() | ES6- | 將一組值轉化為陣列 | 否 |
find() | ES6- | 在陣列內部, 找到第一個符合條件的陣列成員,返回值 | 否 |
findIndex() | ES6- | 在陣列內部, 找到第一個符合條件的陣列成員,返回索引 | 否 |
includes() | ES7- | 表示某個陣列是否包含給定的值,與字串的includes()方法類似 | 否 |
二、方法詳解
在講解陣列方法前,我們先簡單將陣列方法按上方表格內容分為下面兩大類
(1)使用後會改變原陣列
(2)使用後不會改變原陣列
第一類、使用後原陣列改變,失去原陣列,得到改變後的新陣列
1.pop()
功能:用於刪除並返回陣列的最後一個元素。
引數:無
var arr = [1,2,3];
console.log(arr.pop()); //3---刪除並返回3
console.log(arr); //[1,2]---原陣列改變
2.push()
功能:向陣列的末尾新增一個或更多元素,並返回陣列新的長度。
引數:push(newData1, newData2, ......)
var arr = [1,2,3];
console.log(arr.push("a")); //4---返回陣列現在的長度
console.log(arr); //[1,2,3,"a"]---原陣列改變
console.log(arr.push("hello","world")); //6---一次可新增多個數組,返回新的陣列長度
console.log(arr); //[1,2,3,"a","hello",world]---原陣列改變
3.shift()
功能:方法用於刪除並返回陣列的第一個元素。
引數:無
var arr = [1,2,3]
console.log(arr.shift()); //1---返回被刪除的元素
console.log(arr); //[2,3]---原陣列改變
console.log(arr.shift()); //2---返回被刪除的元素
console.log(arr); //[3]---原陣列改變
4.unshift()
功能:向陣列的開頭新增一個或更多元素,並返回新的長度。
引數:unshift(newData1, newData2, ......)
var arr = [1,2,3];
console.log(arr.unshift("world")); //4---返回當前的陣列長度
console.log(arr); //["world",1,2,3]---原陣列改變
console.log(arr.unshift("a","b","hello")); //7---返回當前的陣列長度,可一次性新增多個元素
console.log(arr); //["a","b","hello","world",1,2,3]---原陣列改變
5.reverse()
功能:顛倒陣列中元素的順序,並返回更改後的陣列
引數:無
var arr = [1,2,3];
console.log(arr.reverse()); //[3,2,1]---返回顛倒後的陣列
console.log(arr); //[3,2,1]---原陣列改變
6.sort()
功能:對陣列中的元素進行排序,預設是升序,返回新陣列
引數:無
var arr = [6,1,5,2,3,4];
console.log(arr.sort()); //[1, 2, 3, 4, 5, 6]---返回排序後的新陣列,預設升序排列
console.log(arr); //[1, 2, 3, 4, 5, 6]---原陣列改變
注意:但是在排序前,會先呼叫陣列的toString方法,將每個元素都轉成字元之後,再進行排序,此時會按照字串的排序,逐位比較,進行排序。
var arr = [6,1024,52,256,369];
console.log(arr.sort()); //[1024, 256, 369, 52, 6]---按照第一個字元的大小排序,多位數值的排序會出錯
console.log(arr); //[1024, 256, 369, 52, 6]---原陣列改變
解決方法:通過回撥函式實現
引數:sort(callback)
如果需要按照數值排序,需要傳參。sort(callback),callback為回撥函式,該函式應該具有兩個引數,比較這兩個引數,然後返回一個用於說明這兩個值的相對順序的數字(a-b)。其返回值如下:
若 a 小於 b,返回一個小於 0 的值。
若 a 等於 b,則返回 0。
若 a 大於 b,則返回一個大於 0 的值。
1)從小到大排序
var arr = [6,1024,52,256,369];
console.log(arr.sort(fn)); //[6, 52, 256, 369, 1024]---排序正常升序
console.log(arr); //[6, 52, 256, 369, 1024]---原陣列改變
function fn(a,b){
return a-b;
}
2)從大到小排序
var arr = [6,1024,52,256,369];
console.log(arr.sort(fn)); //[1024, 369, 256, 52, 6]---排序正常降序
console.log(arr); //[1024, 369, 256, 52, 6]---原陣列改變
function fn(a,b){
return b-a;
}
7.splice()
功能:向陣列中新增,或從陣列刪除,或替換陣列中的元素,然後返回被刪除/替換的元素。
引數:splice(start,num,data1,data2,...); 所有引數全部可選;分為多種情況
start:整數,規定新增/刪除專案位置的索引,使用負數可從陣列結尾處規定刪除的位置
num:整數,規定要刪除元素的數量,若為0則不會刪除
data1,data2,data3.....:可選,規定需要新增的元素
(1)不傳參時:無操作
var arr = ["Tom","Jack","Lucy","Lily","May"];
console.log(arr.splice()); //[]---不傳參,不操作,沒有沒刪除替換的元素,返回空陣列
console.log(arr); //["Tom","Jack","Lucy","Lily","May"]---無操作,原陣列未變,返回原陣列
(2)只傳入start:表示從索引為start的資料開始刪除,直到陣列結束
var arr = ["Tom","Jack","Lucy","Lily","May"];
console.log(arr.splice(2)); //["Lucy", "Lily", "May"]--從索引為2開始刪除,直到結束,返回被刪除的陣列
console.log(arr); //["Tom", "Jack"]---原陣列改變,返回改變後的陣列
var arr = ["Tom","Jack","Lucy","Lily","May"];
console.log(arr.splice(0)); //["Tom","Jack","Lucy","Lily","May"]--從索引為0開始刪除,直到結束
console.log(arr); //[]---原陣列資料被全部刪除,返回空陣列
(3)傳入start和num:表示從索引為start的資料開始刪除,刪除num個
var arr = ["Tom","Jack","Lucy","Lily","May"];
console.log(arr.splice(1,3)); //["Jack", "Lucy", "Lily",]---從索引為2開始刪除,刪除3個元素
console.log(arr); //["Tom", "May"]---原陣列改變,按順序返回剩下的元素
(4)傳入更多:表示從索引為start的資料開始刪除,刪除num個,並將第三個引數及後面所有引數,插入到start的位置
1)刪除的資料,等於,新增的資料,數量相同。相當於把某幾個資料替換了
var arr = ["Tom","Jack","Lucy","Lily","May"];
console.log(arr.splice(2,2,"a","b")); //["Lucy", "Lily"]--從索引為2開始刪除2個,再把"a""b"插入刪除的空隙
console.log(arr); //["Tom", "Jack", "a", "b", "May"]---原陣列改變,相當於被替換了
2)刪除的資料,多於,新增的資料。多的空位由後面的資料向前移補上
var arr = ["Tom","Jack","Lucy","Lily","May"];
console.log(arr.splice(2,2,"a"));//["Lucy", "Lily"]--從索引為2開始刪除2個,再把"a"插入刪除的空隙,多的空隙,後面資料補上來。
console.log(arr); //["Tom", "Jack", "a", "May"]---原陣列改變
3)刪除的資料,少於,新增的資料。多的資料擠進去,後面的元素都相應後退。
var arr = ["Tom","Jack","Lucy","Lily","May"];
console.log(arr.splice(2,1,"a","b")); //["Lucy"]--從索引為2開始刪除2個,再把"a""b"插入刪除的空隙
console.log(arr); //["Tom", "Jack", "a", "b", "Lily", "May"]---原陣列改變
(5)傳入更多:表示從索引為start的資料開始刪除,刪除num個,並將第三個引數及後面所有引數,插入到start的位置
var arr = ["Tom","Jack","Lucy","Lily","May"];
console.log(arr.splice(2,0,"a","b")); //[]
console.log(arr); //["Tom", "Jack", "a", "b", "Lucy", "Lily", "May"]---原陣列改變
8.ES6新增:copyWithin()
功能:在當前陣列內部,將指定位置的成員複製到其他位置頂替掉原來位置的元素,並返回新陣列
引數:copyWithin(target,start=0,end=this.length)
target:從該索引位置開始替換元素,如果為負值,則表示從右往左
start:從該索引位置開始讀取元素(包括該索引對應的元素)。預設為0,如果為負值,則表示從右往左
end:到該索引位置前停止讀取元素(不包括該索引對應的元素)。預設等於陣列長度,使用負數可從陣列結尾處規定位置開始
Tip:陣列的長度前後不會改變
var arr=["Tom","Jack","Lucy","Lily","May","Alice","Ben","Rouse","Peter"]
console.log(arr.copyWithin(1,3,6));
//["Tom", "Lily", "May", "Alice", "May", "Alice", "Ben", "Rouse", "Peter"]
//從索引為1的元素開始被替換,從索引為3的元素開始讀取要替換的 索引為6的元素前面停止替換
//簡單來說就是將索引為3,4,5位置的元素複製到索引為1,2,3的位置上.後面的元素不變。
var arr = [1, 2, 3, 4, 5];
console.log(arr.copyWithin(0, -2, -1));//負數表示從右到左數索引。-2相當於索引2的位置,-1相當索引為3的位置
//[4, 2, 3, 4, 5]
//表示將索引為-2的元素複製到索引為0的位置上
9.ES6新增:fill()
功能:使用給定的值,填充到陣列中,類似於替換
引數:fill(data,start,end)
data:要填充陣列的值
start:填充開始的位置,預設值是0
end:填充結束的位置,預設值是this.length(陣列長度)
var arr = ["a","b","c"];
console.log(arr.fill(7));//[7, 7, 7]---start和end都為0,預設填充所有元素
console.log(arr);//[7, 7, 7]---原陣列改變
var arr = ["a","b","c","d","e","f"];
console.log(arr.fill(7, 1, 4));//["a", 7, 7, 7, "e", "f"]---將索引1到4的元素填充為7
console.log(arr);//["a", 7, 7, 7, "e", "f"]---原陣列改變
第二類、使用後原陣列不變,返回新陣列後,仍然可以得到原陣列
1.concat()
功能:用於將兩個或多個數組連線到一起
引數:concat(data1,data2,...);
data:為陣列時,將data合併到原陣列;data為具體資料時直接新增到原陣列尾部;省略時建立原陣列的副本
var arr1 = [1,2,3];
var arr2 = arr1.concat();
console.log(arr1); //[1,2,3]---原陣列
console.log(arr2); //[1,2,3]---原陣列的副本;看起來和原陣列一樣,但他們是兩個東西,不相等。
console.log(arr1 === arr2); //false---陣列也是物件的一種,所有物件都不相等,除非是物件本身等於自己
console.log(arr1.concat("hello","world"));//[1,2,3,"hello","world"]---將字元拼接到陣列後
console.log(arr1.concat(["a","b"],[[3,4],{"name":"admin"}]));//[1,2,3,"a","b",[3,4],{"name":"admin"}]
var arr3 = [4,5,6];
console.log(arr1.concat(arr3));//[1, 2, 3, 4, 5, 6]---將兩個陣列拼接
console.log(arr1); //[1,2,3]---原陣列未改變
2.join()
功能:根據指定分隔符將陣列中的所有元素放入一個字串,並返回這個字串
引數:join(str);
str:預設為","號,以傳入的字元作為分隔符
var arr = [1,2,3];
console.log(arr.join()); //1,2,3---將陣列每個元素用","連線成字串並返回
console.log(arr.join("-")); //1-2-3---將陣列每個元素用"-"連線成字串並返回
console.log(arr); //[1,2,3]---原陣列未改變
//當數組裡的元素也是陣列或物件時
var a= [['OBKoro1','23'],'test'];
console.log(a.join("*"));//OBKoro1,23*test---陣列內的還是用","連線(join只對一維陣列連線,多維陣列時,裡面的陣列不連線,只是轉成字串),陣列外的用"*"連線
var b= [{name:'OBKoro1',age:'23'},'test'];
console.log(b.join("*"));//[object Object]*test---陣列內是物件時。會出問題,先轉成陣列,物件內容顯示"Object",再連線。不能顯示具體值
// 物件轉字串推薦JSON.stringify(obj);
3.slice()
功能:可從已有的陣列中返回選定的元素。
引數:slice(start, end)
start:為必填,表示從第幾位索引開始。若為負數,則表示從後往前計算索引
end:為可填,表示到第幾位結束(不包含end位),省略表示到最後一位;若為負數,則表示從後往前計算索引
var arr = ["Tom","Jack","Lucy","Lily","May"];
console.log(arr.slice(1,3)); //["Jack","Lucy"]---返回索引為1,2的元素組成的陣列
console.log(arr.slice(1)); //["Jack","Lucy","Lily","May"]---返回索引為1,2,3,4的元素組成的陣列
console.log(arr.slice(-4,-1)); //["Jack","Lucy","Lily"]
console.log(arr.slice(-2)); //["Lily","May"]
console.log(arr.slice(1,-2)); //["Jack","Lucy"]
console.log(arr); //["Tom","Jack","Lucy","Lily","May"]---原陣列未改變
4.toString()
功能:轉換成字串,類似於沒有引數的join()。該方法會在資料發生隱式型別轉換時被自動呼叫,如果手動呼叫,就是直接轉為字串。
引數:無
var arr = [1,2,3];
var a= [{name:'OBKoro1',age:'23'},'test'];
console.log(arr.toString()); //1,2,3---轉為字元
console.log(a.toString()); //[object Object],test--物件沒辦法直接轉
console.log(arr); //[1,2,3]---原陣列未改變
5.valueOf()
功能:返回陣列的原始值(一般情況下其實就是陣列自身),一般由js在後臺呼叫,並不顯式的出現在程式碼中
引數:無
var arr = [1,2,3];
console.log(arr.valueOf()); //[1,2,3]---返回的是陣列本身
console.log(arr); //[1,2,3]---原陣列未變
//為了證明返回的是陣列自身
console.log(arr.valueOf() == arr); //true
6.indexOf()
功能:根據指定的資料,從左向右,查詢某元素在陣列中出現的位置,如果不存在指定的元素,返回-1。該方法是查詢方法,不會對陣列產生改變。
引數:indexOf(value, start);
value:必填,要查詢的資料;
start:選填,表示開始查詢的位置,當start為負數時,從陣列的尾部向前數;如果查詢不到value的存在,則方法返回-1
var arr = ["h","e","l","l","o"];
console.log(arr.indexOf("l")); //2---字母"l"在陣列中的索引,返回第一個索引
console.log(arr.indexOf("l",3)); //3
console.log(arr.indexOf("l",4)); //-1---從索引為4的位置開始查詢,未找到返回-1
console.log(arr.indexOf("l",-1)); //-1
console.log(arr.indexOf("l",-3)); //2
console.log(arr); // ["h","e","l","l","o"]---原陣列未改變
7.lastIndexOf()
功能:根據指定的資料,從右向左,查詢在陣列中出現的位置,如果不存在指定的資料,返回-1。該方法是查詢方法,不會對陣列產生改變。
引數:lastIndexOf(value, start);
value:必填,要查詢的資料;
start:選填,表示開始查詢的位置,當start為負數時,從陣列的頭部向尾部數;如果查詢不到value的存在,則方法返回-1
var arr = ["h","e","l","l","o"];
console.log(arr.lastIndexOf("l")); //3
console.log(arr.lastIndexOf("l",3)); //3
console.log(arr.lastIndexOf("l",1)); //-1
console.log(arr.lastIndexOf("l",-3)); //2
console.log(arr.lastIndexOf("l",-4)); //-1
console.log(arr); // ["h","e","l","l","o"]---原陣列未改變
8.forEach()
功能:用來遍歷陣列,該方法沒有返回值。forEach接收的回撥函式會根據陣列的每一項執行,該回調函式預設有三個引數,分別為:遍歷到的陣列的資料,對應的索引,陣列自身。
引數:forEach(callback);callback預設有三個引數,分別為value,index,self。
value:遍歷到的陣列元素
index:元素對應的索引
self:陣列自身
var arr = ["Tom","Jack","Lucy","Lily","May"];
var a = arr.forEach(function(value,index,self){
console.log(index + "--" + value + "--" + self);
})
// 列印結果為:---第一列為遍歷到的陣列元素,第二列為對應的索引,第三列為陣列自身
// 0--Tom--Tom,Jack,Lucy,Lily,May
// 1--Jack--Tom,Jack,Lucy,Lily,May
// 2--Lucy--Tom,Jack,Lucy,Lily,May
// 3--Lily--Tom,Jack,Lucy,Lily,May
// 4--May--Tom,Jack,Lucy,Lily,May
console.log(arr); //["Tom","Jack","Lucy","Lily","May"]---原陣列未改變
console.log(a); //undefined---forEach沒有返回值
//該方法為遍歷方法,不會修改原陣列
9.map()
功能:1.同forEach功能;2.map的回撥函式會將執行結果返回,最後map將所有回撥函式的返回值組成新陣列返回。
引數:map()接收一個回撥函式作為引數,這個回撥函式需要有返回值;map(callback);callback預設有三個引數,分別為value,index,self。
value:遍歷到的陣列元素
index:元素對應的索引
self:陣列自身
(1)功能1:同forEach
var arr = ["Tom","Jack","Lucy","Lily","May"];
var a = arr.map(function(value,index,self){
console.log(index + "--" + value + "--" + self);
})
// 列印結果為:---第一列為遍歷到的陣列元素,第二列為對應的索引,第三列為陣列自身
// 0--Tom--Tom,Jack,Lucy,Lily,May
// 1--Jack--Tom,Jack,Lucy,Lily,May
// 2--Lucy--Tom,Jack,Lucy,Lily,May
// 3--Lily--Tom,Jack,Lucy,Lily,May
// 4--May--Tom,Jack,Lucy,Lily,May
(2)功能2:每次回撥函式的返回值被map組成新陣列返回
var arr = ["Tom","Jack","Lucy","Lily","May"];
var a = arr.map(function(value,index,self){
return "hi:"+value;
})
console.log(a); //["hi:Tom", "hi:Jack", "hi:Lucy", "hi:Lily", "hi:May"]
//可通過此方法批量修改陣列,返回新陣列。
console.log(arr); //["Tom", "Jack", "Lucy", "Lily", "May"]---原陣列未改變
10.filter()
功能:1.同forEach功能;2.filter的回撥函式需要返回布林值,當為true時,將本次陣列的資料返回給filter,最後filter將所有回撥函式的返回值組成新陣列返回(此功能可理解為“過濾”)。
引數:filter()接收一個回撥函式作為引數,這個回撥函式需要有返回值;filter(callback);callback預設有三個引數,分別為value,index,self
value:遍歷到的陣列元素
index:元素對應的索引
self:陣列自身
(1)功能1:同forEach
var arr = ["Tom","Jack","Lucy","Lily","May"];
var a = arr.filter(function(value,index,self){
console.log(index + "--" + value + "--" + self);
})
// 列印結果為:---第一列為遍歷到的陣列元素,第二列為對應的索引,第三列為陣列自身
// 0--Tom--Tom,Jack,Lucy,Lily,May
// 1--Jack--Tom,Jack,Lucy,Lily,May
// 2--Lucy--Tom,Jack,Lucy,Lily,May
// 3--Lily--Tom,Jack,Lucy,Lily,May
// 4--May--Tom,Jack,Lucy,Lily,May
(2)功能2:當回撥函式的返回值為true時,本次的陣列值返回給filter,被filter組成新陣列返回
var arr = ["Tom","Jack","Lucy","Lily","May"];
var a = arr.filter(function(value,index,self){
return value.length > 3;//返回元素長度大於3的元素。若有符合條件的元素,返回元素
})
console.log(a); //["Jack", "Lucy", "Lily"]
//相當於一個篩選器(過濾器),可以在陣列中查詢需要的內容並返回
console.log(arr); //["Tom", "Jack", "Lucy", "Lily", "May"]---原陣列未改變
11.every()
功能:判斷陣列中每一項是否都滿足條件,只有所有項都滿足條件,才會返回true。
引數:every()接收一個回撥函式作為引數,這個回撥函式需要有返回值;every(callback);callback預設有三個引數,分別為value,index,self
value:遍歷到的陣列元素
index:元素對應的索引
self:陣列自身
(1)功能1:當回撥函式的返回值為true時,類似於forEach的功能,遍歷所有;如果為false,那麼停止執行,後面的資料不再遍歷,停在第一個返回false的位置。
//demo1:
var arr = ["Tom","abc","Jack","Lucy","Lily","May"];
var a = arr.every(function(value,index,self){
console.log(value + "--" + index + "--" + (arr == self))
})
// 列印結果為:沒有返回值,列印了第一個,預設為false,後面的就不再遍歷
// Tom--0--true
//因為回撥函式中沒有return true,預設返回undefined,等同於返回false
//demo2:
var arr = ["Tom","abc","Jack","Lucy","Lily","May"];
var a = arr.every(function(value,index,self){
console.log(value + "--" + index + "--" + (arr == self))
return value.length < 4;
})
// 列印結果為:
// Tom--0--true
// abc--1--true
// Jack--2--true
//因為當遍歷到Jack時,回撥函式到return返回false,此時Jack已經遍歷,但是後面資料就不再被遍歷了
//demo3:
var arr = ["Tom","abc","Jack","Lucy","Lily","May"];
var a = arr.every(function(value,index,self){
console.log(value + "--" + index + "--" + (arr == self))
return true;
})
// 列印結果為:
// Tom--0--true
// abc--1--true
// Jack--2--true
// Lucy--3--true
// Lily--4--true
// May--5--true
//因為每個回撥函式的返回值都是true,那麼會遍歷陣列所有資料,等同於forEach功能
(2)功能2:當每個回撥函式的返回值都為true時,every的返回值為true,只要有一個回撥函式的返回值為false,every的返回值都為false
//demo1:
var arr = ["Tom","abc","Jack","Lucy","Lily","May"];
var a = arr.every(function(value,index,self){
return value.length > 3;
})
console.log(a); //false---只要出現一個false,返回值就為false
//demo2:
var arr = ["Tom","abc","Jack","Lucy","Lily","May"];
var a = arr.every(function(value,index,self){
return value.length > 2;
})
console.log(a); //true---遍歷陣列全部為true,才能返回true
12.some()
功能:判斷陣列中是否存在滿足條件的項,只要有一項滿足條件,就會返回true。
引數:some()接收一個回撥函式作為引數,這個回撥函式需要有返回值,some(callback);callback預設有三個引數,分別為value,index,self
value:遍歷到的陣列元素
index:元素對應的索引
self:陣列自身
(1)功能1
因為要判斷陣列中的每一項,只要有一個回撥函式返回true,some都會返回true,所以與every正好相反,當遇到一個回撥函式的返回值為true時,可以確定結果,那麼停止執行,後面都資料不再遍歷,停在第一個返回true的位置;當回撥函式的返回值為false時,需要繼續向後執行,到最後才能確定結果,所以會遍歷所有資料,實現類似於forEach的功能,遍歷所有。
//demo1:
var arr = ["Tom","abc","Jack","Lucy","Lily","May"];
var a = arr.some(function(value,index,self){
console.log(value + "--" + index + "--" + (arr == self))
return value.length > 3;
})
// 列印結果為:
// Tom--0--true
// abc--1--true
// Jack--2--true
//demo2:
var arr = ["Tom","abc","Jack","Lucy","Lily","May"];
var a = arr.some(function(value,index,self){
console.log(value + "--" + index + "--" + (arr == self))
return true;
})
// 列印結果為:
// Tom--0--true
//demo3:
var arr = ["Tom","abc","Jack","Lucy","Lily","May"];
var a = arr.some(function(value,index,self){
console.log(value + "--" + index + "--" + (arr == self))
return false;
})
// 列印結果為:
// Tom--0--true
// abc--1--true
// Jack--2--true
// Lucy--3--true
// Lily--4--true
// May--5--true
(2)功能2
與every相反,只要有一個回撥函式的返回值都為true,some的返回值為true,所有回撥函式的返回值為false,some的返回值才為false
//demo1:
var arr = ["Tom","abc","Jack","Lucy","Lily","May"];
var a = arr.some(function(value,index,self){
return value.length > 3;
})
console.log(a); //true
//demo2:
var arr = ["Tom","abc","Jack","Lucy","Lily","May"];
var a = arr.some(function(value,index,self){
return value.length > 4;
})
console.log(a); //false
13.reduce()
功能:從陣列的第一項開始,逐個遍歷到最後,迭代陣列的所有項,然後構建一個最終返回的值。
引數:reduce()接收一個或兩個引數:第一個是回撥函式,表示在陣列的每一項上呼叫的函式;第二個引數(可選的)作為歸併的初始值,被回撥函式第一次執行時的第一個引數接收。
reduce(callback,initial);callback預設有四個引數,分別為prev,now,index,self
callback返回的任何值都會作為下一次執行的第一個引數。
如果initial引數被省略,那麼第一次迭代發生在陣列的第二項上,因此callback的第一個引數是陣列的第一項,第二個引數就是陣列的第二項。
prev:初始值, 或者計算結束後的返回值
now:當前元素值
index:當前元素的索引
self:陣列自身
//demo1:不省略initial引數,回撥函式沒有返回值
var arr = [10,20,30,40,50];
arr.reduce(function(prev,now,index,self){
console.log(prev + "--" + now + "--" + index + "--" + (arr == self))
}, 2019)
// 列印結果為:
// 2019--10--0--true
// undefined--20--1--true
// undefined--30--2--true
// undefined--40--3--true
// undefined--50--4--true
// 此時回撥函式沒有return,所以從第二次開始,prev拿到的是undefined
//demo2:省略initial引數,回撥函式沒有返回值
var arr = [10,20,30,40,50];
arr.reduce(function(prev,now,index,self){
console.log(prev + "--" + now + "--" + index + "--" + (arr == self))
})
// 列印結果為:第一次,回撥函式的第一個引數是陣列的第一項。第二個引數就是陣列的第二項
// 10--20--1--true
// undefined--30--2--true
// undefined--40--3--true
// undefined--50--4--true
// 此時回撥函式沒有return,所以從第二次開始,prev拿到的是undefined
//demo3:不省略initial引數,回撥函式有返回值
var arr = [10,20,30,40,50];
arr.reduce(function(prev,now,index,self){
console.log(prev + "--" + now + "--" + index + "--" + (arr == self));
return "hello";
}, 2019)
// 列印結果為:
// 2019--10--0--true
// hello--20--1--true
// hello--30--2--true
// hello--40--3--true
// hello--50--4--true
// 此時回撥函式有return,所以從第二次開始,prev拿到的是回撥函式return的值
//demo4:省略initial引數,回撥函式有返回值
var arr = [10,20,30,40,50];
arr.reduce(function(prev,now,index,self){
console.log(prev + "--" + now + "--" + index + "--" + (arr == self));
return "hello";
})
// 列印結果為:第一次,回撥函式的第一個引數是陣列的第一項。第二個引數就是陣列的第二項
// 10--20--1--true
// hello--30--2--true
// hello--40--3--true
// hello--50--4--true
// 此時回撥函式有return,所以從第二次開始,prev拿到的是回撥函式return的值
//demo5:使用reduce計算陣列中所有資料的和
var arr = [10,20,30,40,50];
var sum = arr.reduce(function(prev,now,index,self){
return prev + now;
})
console.log(sum); //150
// 回撥函式的最後一次return的結果被返回到reduce方法的身上
//demo6:使用reduce計算陣列中所有資料的和
var arr = [10,20,30,40,50];
var sum = arr.reduce(function(prev,now,index,self){
return prev + now;
}, 8)
console.log(sum); //158
// 回撥函式的最後一次return的結果被返回到reduce方法的身上
// 因為reduce有第二個引數initial,在第一次執行時被計算,所以最終結果被加上8
14.reduceRight()
功能:從陣列的第一項開始,逐個遍歷到最後,迭代陣列的所有項,然後構建一個最終返回的值。
引數:reduce()接收一個或兩個引數:第一個是回撥函式,表示在陣列的每一項上呼叫的函式;第二個引數(可選的)作為歸併的初始值,被回撥函式第一次執行時的第一個引數接收。
reduce(callback,initial);callback預設有四個引數,分別為prev,now,index,self
callback返回的任何值都會作為下一次執行的第一個引數。
如果initial引數被省略,那麼第一次迭代發生在陣列的第二項上,因此callback的第一個引數是陣列的第一項,第二個引數就是陣列的第二項。
prev:初始值, 或者計算結束後的返回值
now:當前元素值
index:當前元素的索引
self:陣列自身
//demo1:不省略initial引數,回撥函式沒有返回值
var arr = [10,20,30,40,50];
arr.reduceRight(function(prev,now,index,self){
console.log(prev + "--" + now + "--" + index + "--" + (arr == self))
}, 2019)
// 列印結果為:
//2019--50--4--true
//undefined--40--3--true
//undefined--30--2--true
//undefined--20--1--true
//undefined--10--0--true
// 此時回撥函式沒有return,所以從第二次開始,prev拿到的是undefined
//demo2:省略initial引數,回撥函式沒有返回值
var arr = [10,20,30,40,50];
arr.reduceRight(function(prev,now,index,self){
console.log(prev + "--" + now + "--" + index + "--" + (arr == self))
})
// 列印結果為:第一次,回撥函式的第一個引數是陣列的第一項。第二個引數就是陣列的第二項
//50--40--3--true
//undefined--30--2--true
//undefined--20--1--true
//undefined--10--0--true
// 此時回撥函式沒有return,所以從第二次開始,prev拿到的是undefined
//demo3:不省略initial引數,回撥函式有返回值
var arr = [10,20,30,40,50];
arr.reduceRight(function(prev,now,index,self){
console.log(prev + "--" + now + "--" + index + "--" + (arr == self));
return "hello";
}, 2019)
// 列印結果為:
//2019--50--4--true
//hello--40--3--true
//hello--30--2--true
//hello--20--1--true
//hello--10--0--true
// 此時回撥函式有return,所以從第二次開始,prev拿到的是回撥函式reduceRight的值
//demo4:省略initial引數,回撥函式有返回值
var arr = [10,20,30,40,50];
arr.reduceRight(function(prev,now,index,self){
console.log(prev + "--" + now + "--" + index + "--" + (arr == self));
return "hello";
})
// 列印結果為:第一次,回撥函式的第一個引數是陣列的第一項。第二個引數就是陣列的第二項
//50--40--3--true
//hello--30--2--true
//hello--20--1--true
//hello--10--0--true
// 此時回撥函式有return,所以從第二次開始,prev拿到的是回撥函式reduceRight的值
//demo5:使用reduce計算陣列中所有資料的和
var arr = [10,20,30,40,50];
var sum = arr.reduceRight(function(prev,now,index,self){
return prev + now;
})
console.log(sum); //150
// 回撥函式的最後一次return的結果被返回到reduceRight方法的身上
//demo6:使用reduce計算陣列中所有資料的和
var arr = [10,20,30,40,50];
var sum = arr.reduceRight(function(prev,now,index,self){
return prev + now;
}, 8)
console.log(sum); //158
// 回撥函式的最後一次return的結果被返回到reduceRight方法的身上
// 因為reduceRight有第二個引數initial,在第一次執行時被計算,所以最終結果被加上8
15.ES6新增:from()
功能:將類陣列物件和可遍歷物件轉化為陣列
引數:from(object, mapFunction, thisValue)
object:必需,要轉換為陣列的物件
mapFunction:可選,陣列中每個元素要呼叫的函式
thisValue:可選,對映函式(mapFunction)中的 this 物件
var arr = "foo";
console.log(Array.from(arr));//["f", "o", "o"]---將類陣列物件轉換為陣列
console.log(arr);//"foo"---不改變原物件
16.ES6新增:of()
功能:將一組值轉化為陣列
引數:of(element0[, element1[, ...[, elementN]]])
elementN:任意個引數,將按順序成為返回陣列中的元素
console.log(Array.of(1)); // [1]
console.log(Array.of(1, 2, 3)); // [1, 2, 3]
console.log(Array.of(undefined)); // [undefined]
17.ES6新增:find()
功能:在陣列內部, 找到第一個符合條件的陣列成員
引數:find(callback[, thisArg]);callback回撥函式接受三個引數(element,index,self)
element:可選;當前遍歷到的元素
index:可選:當前遍歷到的索引
self:可選:陣列本身
thisArg:執行回撥時用作this
的物件
var array = [5, 12, 8, 130, 44];
var found = array.find(function(element) {
return element > 10;
});
console.log(found);//12
console.log(array)//[5, 12, 8, 130, 44]---原陣列不便
18.ES6新增陣列findIndex()
功能:在陣列內部, 找到第一個符合條件的陣列成員 ,返回索引,若找不到返回-1
引數:arr.findIndex(callback[, thisArg]);callback回撥函式接受三個引數(element,index,self)
element:可選;當前遍歷到的元素
index:可選:當前遍歷到的索引
self:可選:陣列本身
thisArg:執行回撥時用作this
的物件
var array = [5, 12, 8, 130, 44];
function isLargeNumber(element) {
return element > 13;
}
console.log(array.findIndex(isLargeNumber));//3
console.log(array);//[5, 12, 8, 130, 44]---陣列未改變
19.ES7新增:includes()
功能:用來判斷一個數組是否包含一個指定的值,根據情況,如果包含則返回 true,否則返回false
引數: arr.includes(valueToFind[, fromIndex])
fromIndex:從fromIndex
索引處開始查詢 valueToFind
。如果為負值,則按升序從 array.length + fromIndex
的索引開始搜 (即使從末尾開始往前跳 fromIndex
的絕對值個索引,然後往後搜尋)。預設為 0。
valueToFind:需要查詢的元素值
var array = [1, 2, 3];
console.log(array1.includes(2));//true
console.log(array);//[1, 2, 3]---原陣列未改變
var pets = ['cat', 'dog', 'bat'];
console.log(pets.includes('cat'));//true
console.log(pets.includes('at'));//false
console.log(pets);//['cat', 'dog', 'bat']---原陣列未改變