摘要:本文是重溫基礎系列文章的第十篇。返回一個由回調函數的返回值組成的新數組。返回一個數組迭代器對象,該迭代器會包含所有數組元素的鍵值對。回調函數接收三個參數,當前值當前位置和原數組。
本文是 重溫基礎 系列文章的第十篇。
今日感受:平安夜,多棒。
系列目錄:
【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理)
【重溫基礎】1.語法和數據類型
【重溫基礎】2.流程控制和錯誤處理
【重溫基礎】3.循環(huán)和迭代
【重溫基礎】4.函數
【重溫基礎】5.表達式和運算符
【重溫基礎】6.數字
【重溫基礎】7.時間對象
【重溫基礎】8.字符串
【重溫基礎】9.正則表達式
本章節(jié)復習的是JS中的數組,以索引進行排序。
前置知識:
數組是一個有序的數據集合,使用數組名稱和索引進行訪問。
let arr = [1,2,3]; arr[0] = 1;
在JavaScript中數組沒有明確數據類型。
let arr = [1, "hi", undefined, fun()];1.創(chuàng)建數組
創(chuàng)建數組方法有3種:
let arr = new Array(ele1, ele2, ele3, ..., eleN); let arr = Array(ele1, ele2, ele3, ..., eleN); let arr = [ele1, ele2, ele3, ..., eleN];
上面是已知數組元素,另外一種還有創(chuàng)建一個長度不為0,且有沒有任何元素的數組:
let len = 5; let arr = new Array(len); // 方法1 let arr = Array(len); // 方法2 let arr = []; // 方法3 arr.length = len;
若傳入的數組長度不是整數,則報錯:
let arr = new Array(3.5); let arr = Array(3.5); let arr = []; arr.length = 3.5; //Uncaught RangeError: Invalid array length
其中要注意這兩種創(chuàng)建方法是不同的:
let arr1 = new Array(4); // [empty × 4] let arr2 = [4]; // [4] for(let k in arr1){ console.log(k); } // undefined for(let k in arr2){ console.log(k); } // 02.使用數組 2.1 簡單使用
獲取數組指定位置的值:
let a = [1,2,5]; a[0]; // 1 a[2]; // 5 a[3]; // undefined
獲取數組長度:
let a = [1,2,5]; a.length; // 3 a["length"]; // 3
設置數組指定位置的值:
let a = [1,2,5]; a[0] = 9; a[2] = 99; a[3] = 999;2.2 理解數組length
數組的索引值是從0開始,即上面數組索引0的是1,索引1的值是2,依次下去。
數組length永遠返回的是數組最后一個元素的索引加1。
可通過arr.length = 0來清空數組。
可通過arr.length = len來設置數組長度。
2.3 遍歷數組遍歷數組就是以某種方法處理數組的每個元素,簡單如下:
使用for循環(huán):
let arr = ["pingan", "leo", "robin"]; for (let i = 0; i使用for...in:
let arr = ["pingan", "leo", "robin"]; for(let i in arr){ console.log(`第${i}個元素是:${arr[i]};`) } // 第0個元素是:pingan; // 第1個元素是:leo; // 第2個元素是:robin;使用forEach:
arr.forEach(callback) 接收一個回調方法。
callback(val, index, array) : 接收三個參數:* `val` : 當前處理的元素; * `index` : 當前處理的元素的索引; * `array` : 正在處理的數組;可參考MDN Array.prototype.forEach 的詳細介紹。
let arr = ["pingan", "leo", "robin"]; arr.forEach(function(val, i, array){ console.log(`第${i}個元素是:${val};`) })3. 數組方法(訪問和修改)
方法名稱 方法介紹 concat() 連接兩個或更多的數組,并返回結果。 join() 把數組的所有元素放入一個字符串。元素通過指定的分隔符進行分隔。 pop() 刪除并返回數組的最后一個元素 push() 向數組的末尾添加一個或更多元素,并返回新的長度。 reverse() 顛倒數組中元素的順序。 shift() 刪除并返回數組的第一個元素 slice() 從某個已有的數組返回選定的元素 sort() 對數組的元素進行排序 splice() 刪除元素,并向數組添加新元素。 toSource() 返回該對象的源代碼。 toString() 把數組轉換為字符串,并返回結果。 toLocaleString() 把數組轉換為本地數組,并返回結果。 unshift() 向數組的開頭添加一個或更多元素,并返回新的長度。 valueOf() 返回數組對象的原始值 indexOf() 在數組中搜索指定元素并返回第一個匹配的索引 lastIndexOf() 在數組中搜索指定元素并返回最后一個匹配的索引 可參考W3school JavaScript Array 對象 的詳細介紹。
3.1 concat()連接兩個或更多的數組,并返回一個新數組。
語法:
arr.concat(a1, a2, ..., an);
參數:
arr:目標數組;
a1,a2,...,an:需要合并的元素;let a1 = [1,2,3]; let a2 = [9,99,999]; let a = a1.concat(a2); // [1, 2, 3, 9, 99, 999]3.2 join()使用指定分隔符,連接兩個或多個數組的元素,返回一個字符串。
語法:
arr.join(sep);
參數:
arr:目標數組;
sep:連接的分隔符,默認值為“,”;let arr = ["pingan", "leo", "robin"]; arr.join(); // "pingan,leo,robin" arr.join(""); // "pinganleorobin" arr.join(","); // "pingan,leo,robin"3.3 pop()和push()pop(): 刪除并返回數組最后一個元素,改變原數組。
push(item): 向數組末尾添加一個或多個元素,改變原數組,返回新的數組長度。
方便記憶和理解:兩個都是從數組末尾操作,pop()是刪除最后一個元素,push()是向最后一位添加新的元素。
let arr = ["pingan", "leo"]; let a1 = arr.pop(); // "leo" let a2 = arr.push("robin","hi"); // 3 arr; // ["pingan", "robin", "hi"]3.4 shift()和unshift()shift(): 刪除并返回數組第一個元素,改變原數組。
unshift(item): 向數組頭部添加一個或多個元素,改變原數組,返回新的數組長度。
方便記憶和理解:兩個都是從數組頭部操作,shift()是刪除第一個元素,unshift()是向第一位添加新的元素。
let arr = ["pingan", "leo"]; let a1 = arr.shift(); // "pingan" let a2 = arr.unshift("robin","hi"); // 3 arr; // ["robin", "hi", "leo"]3.5 reverse()顛倒數組中元素的順序,改變原數組。
let arr = [1, 2, 3, 4]; arr.reverse(); //?[4, 3, 2, 1]3.6 slice()用于提取數組中一個片段,作為新數組返回。
slice(start[,end]): 接收2個參數:start: 必需,指定起始索引,若負數則從數組最后開始算起,-1為倒數第一位,-2為倒數第二位,以此類推。
end: 可選,指定結束索引,若沒傳則表示到數組結束。
注意:
end若有指定的話,是不包含end索引上的值。let arr = [1, 2, 3, 5, 6]; let a1 = arr.slice(2); // [3, 5, 6] let a2 = arr.slice(2,3); // [3]3.7 splice()從數組中刪除指定索引開始的項目,然后返回被刪除的項目。
語法:
arr.splice(index, num, a1, a2,...,an);
參數:
index: 必需,起始位置的索引,若負數則從數組最后開始算起;
num:必需,刪除的數量,若為0則不刪除;
a1,a2,...an:可選,為數組添加的元素;let arr = [1, 2, 3, 4]; let a = arr.splice(1, 2, "hi", "leo"); // a => ?[2, 3] // arr => [1, "hi", "leo", 4]3.8 sort()對數組的元素進行排序,改變原數組。
可接受一個回調方法作為比較函數,來決定排序方式。
比較函數應該具有兩個參數 a 和 b,返回值如下:
若 a 小于 b,在排序后的數組中 a 應該出現在 b 之前,則返回一個小于 0 的值。
若 a 等于 b,則返回 0。
若 a 大于 b,則返回一個大于 0 的值。let a1 = [1,3,6,9,10]; a1.sort(); // [1, 10, 3, 6, 9] a1.sort(function(a,b){ return a > b ? 1 : a < b ? -1 : 0; }) // [1, 3, 6, 9, 10]3.9 indexOf()和lastIndexOf()兩者都是在數組搜索指定元素,只是indexOf()返回的是搜索到的第一個元素的索引,而lastIndexOf()返回的是搜索到的最后一個元素的索引。
語法:
indexOf(ele[,start])和lastIndexOf(ele[,start]);
參數:ele: 需要搜索的元素。
start: 開始搜索的索引。
let arr = ["hh1", "hh2", "hh2", "hh2", "hh3", "hh4"]; let a1 = arr.indexOf("hh2"); // 1 let a2 = arr.lastIndexOf("hh2"); // 3 let a3 = arr.indexOf("hh2",2); // 24. 數組方法(迭代)
方法名稱 方法介紹 forEach() 為數組中的每個元素執(zhí)行一次回調函數。 every() 如果數組中的每個元素都滿足測試函數,則返回 true,否則返回 false。 some() 如果數組中至少有一個元素滿足測試函數,則返回 true,否則返回 false。 filter() 將所有在過濾函數中返回 true 的數組元素放進一個新數組中并返回。 map() 返回一個由回調函數的返回值組成的新數組。 reduce() 從左到右為每個數組元素執(zhí)行一次回調函數,并把上次回調函數的返回值放在一個暫存器中傳給下次回調函數,并返回最后一次回調函數的返回值。 reduceRight() 從右到左為每個數組元素執(zhí)行一次回調函數,并把上次回調函數的返回值放在一個暫存器中傳給下次回調函數,并返回最后一次回調函數的返回值。 以下是ES6規(guī)范新增的數組方法:
方法名稱 方法介紹 keys() 返回一個數組迭代器對象,該迭代器會包含所有數組元素的鍵。 values() 返回一個數組迭代器對象,該迭代器會包含所有數組元素的值。 entries() 返回一個數組迭代器對象,該迭代器會包含所有數組元素的鍵值對。 find() 找到第一個滿足測試函數的元素并返回那個元素的值,如果找不到,則返回 undefined。 findIndex() 找到第一個滿足測試函數的元素并返回那個元素的索引,如果找不到,則返回 -1。 可參考MDN Array 的詳細介紹。
4.1 forEach()對數組的每個元素執(zhí)行一次提供的函數。
語法:
arr.forEach(callback)。參數:
callback(val, index, arr) : 需要執(zhí)行的函數,接收三個參數:val : 正在處理的當前元素;
index : 可選,正在處理的當前元素的索引;
arr : 可選,正在操作的數組;
let a = [1,3,5,7]; a.forEach(function(val, index, arr){ arr[index] = val * 2 }) a ; // [2, 6, 10, 14]4.2 every()測試數組的所有元素是否都通過了指定函數的測試。
語法:
arr.every(callback)。參數:
callback(val, index, arr) : 需要執(zhí)行的函數,接收三個參數:val : 正在處理的當前元素;
index : 可選,正在處理的當前元素的索引;
arr : 可選,正在操作的數組;
返回值:
若都通過返回true,否則返回false。let a = [1, "", "aa", 13, 6]; let res = a.every(function(val, index, arr){ return typeof val == "number"; }) res;// false let b = [1, 2, 3]; let r = b.every(function(val, index, arr){ return typeof val == "number"; }) r; // true4.3 some()測試數組中的某些元素是否通過由提供的函數實現的測試。
語法:
arr.some(callback)。參數:
callback(val, index, arr) : 需要執(zhí)行的函數,接收三個參數:val : 正在處理的當前元素;
index : 可選,正在處理的當前元素的索引;
arr : 可選,正在操作的數組;
返回值:
若有一個通過返回true,否則返回false。let a = [1, "", "aa", 13, 6]; let res = a.some(function(val, index, arr){ return typeof val == "number"; }) res;// true let b = [1, 2, 3]; let r = b.some(function(val, index, arr){ return typeof val == "number"; }) r; // true4.4 filter()將所有在過濾函數中返回 true 的數組元素放進一個新數組中并返回。
語法:
arr.filter(callback)。參數:
callback(val, index, arr) : 需要執(zhí)行的函數,接收三個參數:val : 正在處理的當前元素;
index : 可選,正在處理的當前元素的索引;
arr : 可選,正在操作的數組;
返回值:
一個返回通過測試的元素的數組,若都沒有則返回空數組。let a = [1, "", "aa", 13, 6]; let res = a.filter(function(val, index, arr){ return typeof val == "number"; }) res;//[1, 13, 6]4.5 map()傳入一個操作函數,對每個元素執(zhí)行此方法,并返回一個執(zhí)行后的數組。
語法:
arr.map(callback)。參數:
callback(val, index, arr) : 需要執(zhí)行的函數,接收三個參數:val : 正在處理的當前元素;
index : 可選,正在處理的當前元素的索引;
arr : 可選,正在操作的數組;
返回值:
一個新數組,每個元素都是回調函數的結果。let a = [1, 3, 5]; let b = a.map(function(val, index, arr){ return val + 2; }) b; //[3, 5, 7]5. 數組的拓展(ES6) 5.1 拓展運算符拓展運算符使用(...),類似rest參數的逆運算,將數組轉為用(,)分隔的參數序列。
console.log(...[1, 2, 3]); // 1 2 3 console.log(1, ...[2,3], 4); // 1 2 3 4拓展運算符主要使用在函數調用。
function f (a, b){ console.log(a, b); } f(...[1, 2]); // 1 2 function g (a, b, c, d, e){ console.log(a, b, c, d, e); } g(0, ...[1, 2], 3, ...[4]); // 0 1 2 3 4若拓展運算符后面是個空數組,則不產生效果。
[...[], 1]; // [1]替代apply方法
// ES6之前 function f(a, b, c){...}; var a = [1, 2, 3]; f.apply(null, a); // ES6之后 function f(a, b, c){...}; let a = [1, 2, 3]; f(...a); // ES6之前 Math.max.apply(null, [3,2,6]); // ES6之后 Math.max(...[3,2,6]);拓展運算符的運用
(1)復制數組:
通常我們直接復制數組時,只是淺拷貝,如果要實現深拷貝,可以使用拓展運算符。
// 通常情況 淺拷貝 let a1 = [1, 2]; let a2 = a1; a2[0] = 3; console.log(a1,a2); // [3,2] [3,2] // 拓展運算符 深拷貝 let a1 = [1, 2]; let a2 = [...a1]; // let [...a2] = a1; // 作用相同 a2[0] = 3; console.log(a1,a2); // [1,2] [3,2](2)合并數組:
注意,這里合并數組,只是淺拷貝。
let a1 = [1,2]; let a2 = [3]; let a3 = [4,5]; // ES5 let a4 = a1.concat(a2, a3); // ES6 let a5 = [...a1, ...a2, ...a3]; a4[0] === a1[0]; // true a5[0] === a1[0]; // true(3)與解構賦值結合:
與解構賦值結合生成數組,但是使用拓展運算符需要放到參數最后一個,否則報錯。
let [a, ...b] = [1, 2, 3, 4]; // a => 1 b => [2,3,4] let [a, ...b] = []; // a => undefined b => [] let [a, ...b] = ["abc"]; // a => "abc" b => []5.2 Array.from()將 類數組對象 和 可遍歷的對象,轉換成真正的數組。
// 類數組對象 let a = { "0":"a", "1":"b", length:2 } let arr = Array.from(a); // 可遍歷的對象 let a = Array.from([1,2,3]); let b = Array.from({length: 3}); let c = Array.from([1,2,3]).map(x => x * x); let d = Array.from([1,2,3].map(x => x * x));5.3 Array.of()將一組數值,轉換成數組,彌補Array方法參數不同導致的差異。
Array.of(1,2,3); // [1,2,3] Array.of(1).length; // 1 Array(); // [] Array(2); // [,] 1個參數時,為指定數組長度 Array(1,2,3); // [1,2,3] 多于2個參數,組成新數組5.4 find()和findIndex()find()方法用于找出第一個符合條件的數組成員,參數為一個回調函數,所有成員依次執(zhí)行該回調函數,返回第一個返回值為true的成員,如果沒有一個符合則返回undefined。
[1,2,3,4,5].find( a => a < 3 ); // 1回調函數接收三個參數,當前值、當前位置和原數組。
[1,2,3,4,5].find((value, index, arr) => { // ... });findIndex()方法與find()類似,返回第一個符合條件的數組成員的位置,如果都不符合則返回-1。
[1,2,3,4].findIndex((v,i,a)=>{ return v>2; }); // 25.5 fill()用于用指定值填充一個數組,通常用來初始化空數組,并抹去數組中已有的元素。
new Array(3).fill("a"); // ["a","a","a"] [1,2,3].fill("a"); // ["a","a","a"]并且fill()的第二個和第三個參數指定填充的起始位置和結束位置。
[1,2,3].fill("a",1,2);// [1, "a", 3]5.6 entries(),keys(),values()主要用于遍歷數組,entries()對鍵值對遍歷,keys()對鍵名遍歷,values()對鍵值遍歷。
for (let i of ["a", "b"].keys()){ console.log(i) } // 0 // 1 for (let e of ["a", "b"].values()){ console.log(e) } // "a" // "b" for (let e of ["a", "b"].entries()){ console.log(e) } // 0 "a" // 1 "b"5.7 includes()用于表示數組是否包含給定的值,與字符串的includes方法類似。
[1,2,3].includes(2); // true [1,2,3].includes(4); // false [1,2,NaN].includes(NaN); // true第二個參數為起始位置,默認為0,如果負數,則表示倒數的位置,如果大于數組長度,則重置為0開始。
[1,2,3].includes(3,3); // false [1,2,3].includes(3,4); // false [1,2,3].includes(3,-1); // true [1,2,3].includes(3,-4); // true5.8 flat(),flatMap()flat()用于將數組一維化,返回一個新數組,不影響原數組。
默認一次只一維化一層數組,若需多層,則傳入一個整數參數指定層數。
若要一維化所有層的數組,則傳入Infinity作為參數。[1, 2, [2,3]].flat(); // [1,2,2,3] [1,2,[3,[4,[5,6]]]].flat(3); // [1,2,3,4,5,6] [1,2,[3,[4,[5,6]]]].flat("Infinity"); // [1,2,3,4,5,6]flatMap()是將原數組每個對象先執(zhí)行一個函數,在對返回值組成的數組執(zhí)行flat()方法,返回一個新數組,不改變原數組。
flatMap()只能展開一層。[2, 3, 4].flatMap((x) => [x, x * 2]); // [2, 4, 3, 6, 4, 8]6. 數組的拓展(ES7) 6.1 Array.prototype.includes()方法includes()用于查找一個值是否在數組中,如果在返回true,否則返回false。
["a", "b", "c"].includes("a"); // true ["a", "b", "c"].includes("d"); // falseincludes()方法接收兩個參數,搜索的內容和開始搜索的索引,默認值為0,若搜索值在數組中則返回true否則返回false。
["a", "b", "c", "d"].includes("b"); // true ["a", "b", "c", "d"].includes("b", 1); // true ["a", "b", "c", "d"].includes("b", 2); // false與indexOf方法對比,下面方法效果相同:
["a", "b", "c", "d"].indexOf("b") > -1; // true ["a", "b", "c", "d"].includes("b"); // trueincludes()與indexOf對比:
includes相比indexOf更具語義化,includes返回的是是否存在的具體結果,值為布爾值,而indexOf返回的是搜索值的下標。
includes相比indexOf更準確,includes認為兩個NaN相等,而indexOf不會。
let a = [1, NaN, 3]; a.indexOf(NaN); // -1 a.includes(NaN); // true另外在判斷+0與-0時,includes和indexOf的返回相同。
[1, +0, 3, 4].includes(-0); // true [1, +0, 3, 4].indexOf(-0); // 1參考資料1.MDN 索引集合類
2.MDN 數組對象
3.W3school JavaScript Array 對象本部分內容到這結束
Author 王平安 pingan8787@qq.com 博 客 www.pingan8787.com 微 信 pingan8787 每日文章推薦 https://github.com/pingan8787... JS小冊 js.pingan8787.com 歡迎關注微信公眾號【前端自習課】每天早晨,與您一起學習一篇優(yōu)秀的前端技術博文 .
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100425.html
摘要:本文是重溫基礎系列文章的第十一篇。返回一個布爾值,表示該值是否為的成員。使用回調函數遍歷每個成員。與數組相同,對每個成員執(zhí)行操作,且無返回值。 本文是 重溫基礎 系列文章的第十一篇。 今日感受:注意身體,生病花錢又難受。 系列目錄: 【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理) 【重溫基礎】1.語法和數據類型 【重溫基礎】2.流程控制和錯誤處理 【重溫基礎】3....
摘要:本文是重溫基礎系列文章的第十二篇。注意對象的名稱,對大小寫敏感。基礎用法第一個參數是目標對象,后面參數都是源對象。用途遍歷對象屬性。用途將對象轉為真正的結構。使用場景取出參數對象所有可遍歷屬性,拷貝到當前對象中。類似方法合并兩個對象。 本文是 重溫基礎 系列文章的第十二篇。 今日感受:需要總結下2018。 這幾天,重重的感冒發(fā)燒,在家休息好幾天,傷···。 系列目錄: 【復習資料...
摘要:系列目錄復習資料資料整理個人整理重溫基礎篇重溫基礎對象介紹本章節(jié)復習的是中的關于對象相關知識。概念概念有三點全稱對象表示法。對象沒有分號,而對象有。序列化對象時,所有函數及原型成員都會被忽略,不體現在結果上。 本文是 重溫基礎 系列文章的第十六篇。今日感受:靜。 系列目錄: 【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理) 【重溫基礎】1-14篇 【重溫基礎】15...
摘要:本文是重溫基礎系列文章的第十四篇。元,是指程序本身。有理解不到位,還請指點,具體詳細的介紹,可以查看維基百科元編程。攔截,返回一個布爾值。 本文是 重溫基礎 系列文章的第十四篇。 這是第一個基礎系列的最后一篇,后面會開始復習一些中級的知識了,歡迎持續(xù)關注呀! 接下來會統(tǒng)一整理到我的【Cute-JavaScript】的JavaScript基礎系列中。 今日感受:獨樂樂不如眾樂樂...
摘要:歡迎您的支持系列目錄復習資料資料整理個人整理重溫基礎篇重溫基礎對象介紹重溫基礎對象介紹重溫基礎介紹重溫基礎相等性判斷重溫基礎閉包重溫基礎事件本章節(jié)復習的是中的高階函數,可以提高我們的開發(fā)效率。 本文是 重溫基礎 系列文章的第二十一篇。 今日感受:想家。 本人自己整理的【Cute-JavaScript】資料,包含:【ES6/ES7/ES8/ES9】,【JavaScript基礎...
閱讀 1002·2021-09-30 09:58
閱讀 2829·2021-09-09 11:55
閱讀 2001·2021-09-01 11:41
閱讀 991·2019-08-30 15:55
閱讀 3350·2019-08-30 12:50
閱讀 3495·2019-08-29 18:37
閱讀 3295·2019-08-29 16:37
閱讀 2011·2019-08-29 13:00