【重溫基礎(chǔ)】10.數(shù)組

本文是 重溫基礎(chǔ) 系列文章的第十篇矾策。
今日感受:平安夜忙上,多棒。

系列目錄:

本章節(jié)復(fù)習(xí)的是JS中的數(shù)組窥妇,以索引進(jìn)行排序恨统。

前置知識(shí):
數(shù)組是一個(gè)有序的數(shù)據(jù)集合,使用數(shù)組名稱和索引進(jìn)行訪問枕扫。

let arr = [1,2,3];
arr[0] = 1;

在JavaScript中數(shù)組沒有明確數(shù)據(jù)類型陪腌。

let arr = [1, 'hi', undefined, fun()];

1.創(chuàng)建數(shù)組

創(chuàng)建數(shù)組方法有3種:

let arr = new Array(ele1, ele2, ele3, ..., eleN);
let arr = Array(ele1, ele2, ele3, ..., eleN);
let arr = [ele1, ele2, ele3, ..., eleN];

上面是已知數(shù)組元素,另外一種還有創(chuàng)建一個(gè)長(zhǎng)度不為0烟瞧,且有沒有任何元素的數(shù)組

let len = 5;

let arr = new Array(len); // 方法1
let arr = Array(len);     // 方法2
let arr = [];             // 方法3
arr.length = len;

若傳入的數(shù)組長(zhǎng)度不是整數(shù)诗鸭,則報(bào)錯(cuò):

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);
}  // 0

2.使用數(shù)組

2.1 簡(jiǎn)單使用

獲取數(shù)組指定位置的值:

let a = [1,2,5];
a[0];  // 1
a[2];  // 5
a[3];  // undefined

獲取數(shù)組長(zhǎng)度:

let a = [1,2,5];
a.length;    // 3
a["length"]; // 3

設(shè)置數(shù)組指定位置的值:

let a = [1,2,5];
a[0] = 9;
a[2] = 99;
a[3] = 999;

2.2 理解數(shù)組length

  • 數(shù)組的索引值是從0開始,即上面數(shù)組索引0的是1,索引1的值是2燕刻,依次下去只泼。
  • 數(shù)組length永遠(yuǎn)返回的是數(shù)組最后一個(gè)元素的索引加1。
  • 可通過arr.length = 0來清空數(shù)組卵洗。
  • 可通過arr.length = len來設(shè)置數(shù)組長(zhǎng)度请唱。

2.3 遍歷數(shù)組

遍歷數(shù)組就是以某種方法處理數(shù)組的每個(gè)元素,簡(jiǎn)單如下:

  • 使用for循環(huán):
let arr = ["pingan", "leo", "robin"];
for (let i = 0; i<arr.length; i++){
    // 處理元素的操作
    console.log(`第${i}個(gè)元素是:${arr[i]}过蹂;`)
}
// 第0個(gè)元素是:pingan十绑;
// 第1個(gè)元素是:leo;
// 第2個(gè)元素是:robin酷勺;
  • 使用for...in
let arr = ["pingan", "leo", "robin"];
for(let i in arr){
    console.log(`第${i}個(gè)元素是:${arr[i]}本橙;`)
}
// 第0個(gè)元素是:pingan;
// 第1個(gè)元素是:leo脆诉;
// 第2個(gè)元素是:robin甚亭;
  • 使用forEach
    arr.forEach(callback) 接收一個(gè)回調(diào)方法。
    callback(val, index, array) : 接收三個(gè)參數(shù):
    • val : 當(dāng)前處理的元素击胜;
    • index : 當(dāng)前處理的元素的索引亏狰;
    • array : 正在處理的數(shù)組;

可參考MDN Array.prototype.forEach 的詳細(xì)介紹偶摔。

let arr = ["pingan", "leo", "robin"];
arr.forEach(function(val, i, array){
    console.log(`第${i}個(gè)元素是:${val}暇唾;`)
})

3. 數(shù)組方法(訪問和修改)

方法名稱 方法介紹
concat() 連接兩個(gè)或更多的數(shù)組,并返回結(jié)果辰斋。
join() 把數(shù)組的所有元素放入一個(gè)字符串策州。元素通過指定的分隔符進(jìn)行分隔。
pop() 刪除并返回?cái)?shù)組的最后一個(gè)元素
push() 向數(shù)組的末尾添加一個(gè)或更多元素宫仗,并返回新的長(zhǎng)度够挂。
reverse() 顛倒數(shù)組中元素的順序。
shift() 刪除并返回?cái)?shù)組的第一個(gè)元素
slice() 從某個(gè)已有的數(shù)組返回選定的元素
sort() 對(duì)數(shù)組的元素進(jìn)行排序
splice() 刪除元素锰什,并向數(shù)組添加新元素下硕。
toSource() 返回該對(duì)象的源代碼丁逝。
toString() 把數(shù)組轉(zhuǎn)換為字符串,并返回結(jié)果梭姓。
toLocaleString() 把數(shù)組轉(zhuǎn)換為本地?cái)?shù)組霜幼,并返回結(jié)果。
unshift() 向數(shù)組的開頭添加一個(gè)或更多元素誉尖,并返回新的長(zhǎng)度罪既。
valueOf() 返回?cái)?shù)組對(duì)象的原始值
indexOf() 在數(shù)組中搜索指定元素并返回第一個(gè)匹配的索引
lastIndexOf() 在數(shù)組中搜索指定元素并返回最后一個(gè)匹配的索引

可參考W3school JavaScript Array 對(duì)象 的詳細(xì)介紹。

3.1 concat()

連接兩個(gè)或更多的數(shù)組铡恕,并返回一個(gè)新數(shù)組琢感。

  • 語法:
    arr.concat(a1, a2, ..., an);
  • 參數(shù):
    arr:目標(biāo)數(shù)組;
    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()

使用指定分隔符驹针,連接兩個(gè)或多個(gè)數(shù)組的元素,返回一個(gè)字符串诀艰。

  • 語法:
    arr.join(sep);
  • 參數(shù):
    arr:目標(biāo)數(shù)組柬甥;
    sep:連接的分隔符,默認(rèn)值為“,”其垄;
let arr = ["pingan", "leo", "robin"];
arr.join();    // "pingan,leo,robin"
arr.join("");  // "pinganleorobin"
arr.join(","); // "pingan,leo,robin"

3.3 pop()和push()

  • pop(): 刪除并返回?cái)?shù)組最后一個(gè)元素苛蒲,改變?cè)瓟?shù)組

  • push(item): 向數(shù)組末尾添加一個(gè)或多個(gè)元素绿满,改變?cè)瓟?shù)組臂外,返回新的數(shù)組長(zhǎng)度。
    方便記憶和理解:兩個(gè)都是從數(shù)組末尾操作喇颁,pop()是刪除最后一個(gè)元素漏健,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(): 刪除并返回?cái)?shù)組第一個(gè)元素橘霎,改變?cè)瓟?shù)組漾肮。
  • unshift(item): 向數(shù)組頭部添加一個(gè)或多個(gè)元素,改變?cè)瓟?shù)組茎毁,返回新的數(shù)組長(zhǎng)度。

方便記憶和理解:兩個(gè)都是從數(shù)組頭部操作忱辅,shift()是刪除第一個(gè)元素七蜘,unshift()是向第一位添加新的元素。

let arr = ["pingan", "leo"];
let a1 = arr.shift();               // "pingan"
let a2 = arr.unshift("robin","hi"); // 3
arr;   // ["robin", "hi", "leo"]

3.5 reverse()

顛倒數(shù)組中元素的順序墙懂,改變?cè)瓟?shù)組橡卤。

let arr = [1, 2, 3, 4];
arr.reverse();  // [4, 3, 2, 1]

3.6 slice()

用于提取數(shù)組中一個(gè)片段,作為新數(shù)組返回损搬。
slice(start[,end]): 接收2個(gè)參數(shù):

  • start: 必需碧库,指定起始索引柜与,若負(fù)數(shù)則從數(shù)組最后開始算起,-1為倒數(shù)第一位嵌灰,-2為倒數(shù)第二位弄匕,以此類推。
  • end: 可選沽瞭,指定結(jié)束索引迁匠,若沒傳則表示到數(shù)組結(jié)束。

注意
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()

從數(shù)組中刪除指定索引開始的項(xiàng)目,然后返回被刪除的項(xiàng)目豌鹤。

  • 語法:
    arr.splice(index, num, a1, a2,...,an);
  • 參數(shù):
    index: 必需亡哄,起始位置的索引,若負(fù)數(shù)則從數(shù)組最后開始算起布疙;
    num:必需蚊惯,刪除的數(shù)量,若為0則不刪除拐辽;
    a1,a2,...an:可選减噪,為數(shù)組添加的元素;
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()

對(duì)數(shù)組的元素進(jìn)行排序闺鲸,改變?cè)瓟?shù)組维雇。
可接受一個(gè)回調(diào)方法作為比較函數(shù),來決定排序方式睁搭。
比較函數(shù)應(yīng)該具有兩個(gè)參數(shù) ab赶诊,返回值如下:
a 小于 b,在排序后的數(shù)組中 a 應(yīng)該出現(xiàn)在 b 之前园骆,則返回一個(gè)小于 0 的值舔痪。
a 等于 b,則返回 0锌唾。
a 大于 b锄码,則返回一個(gè)大于 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()

兩者都是在數(shù)組搜索指定元素晌涕,只是indexOf()返回的是搜索到的第一個(gè)元素的索引滋捶,而lastIndexOf()返回的是搜索到的最后一個(gè)元素的索引。
語法:
indexOf(ele[,start])lastIndexOf(ele[,start]);
參數(shù):

  • 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);    // 2

4. 數(shù)組方法(迭代)

方法名稱 方法介紹
forEach() 為數(shù)組中的每個(gè)元素執(zhí)行一次回調(diào)函數(shù)。
every() 如果數(shù)組中的每個(gè)元素都滿足測(cè)試函數(shù)惧财,則返回 true巡扇,否則返回 false扭仁。
some() 如果數(shù)組中至少有一個(gè)元素滿足測(cè)試函數(shù),則返回 true厅翔,否則返回 false乖坠。
filter() 將所有在過濾函數(shù)中返回 true 的數(shù)組元素放進(jìn)一個(gè)新數(shù)組中并返回。
map() 返回一個(gè)由回調(diào)函數(shù)的返回值組成的新數(shù)組知给。
reduce() 從左到右為每個(gè)數(shù)組元素執(zhí)行一次回調(diào)函數(shù)瓤帚,并把上次回調(diào)函數(shù)的返回值放在一個(gè)暫存器中傳給下次回調(diào)函數(shù),并返回最后一次回調(diào)函數(shù)的返回值涩赢。
reduceRight() 從右到左為每個(gè)數(shù)組元素執(zhí)行一次回調(diào)函數(shù)戈次,并把上次回調(diào)函數(shù)的返回值放在一個(gè)暫存器中傳給下次回調(diào)函數(shù),并返回最后一次回調(diào)函數(shù)的返回值筒扒。

以下是ES6規(guī)范新增的數(shù)組方法:

方法名稱 方法介紹
keys() 返回一個(gè)數(shù)組迭代器對(duì)象怯邪,該迭代器會(huì)包含所有數(shù)組元素的鍵。
values() 返回一個(gè)數(shù)組迭代器對(duì)象花墩,該迭代器會(huì)包含所有數(shù)組元素的值悬秉。
entries() 返回一個(gè)數(shù)組迭代器對(duì)象,該迭代器會(huì)包含所有數(shù)組元素的鍵值對(duì)冰蘑。
find() 找到第一個(gè)滿足測(cè)試函數(shù)的元素并返回那個(gè)元素的值和泌,如果找不到,則返回 undefined祠肥。
findIndex() 找到第一個(gè)滿足測(cè)試函數(shù)的元素并返回那個(gè)元素的索引武氓,如果找不到,則返回 -1仇箱。

可參考MDN Array 的詳細(xì)介紹县恕。

4.1 forEach()

對(duì)數(shù)組的每個(gè)元素執(zhí)行一次提供的函數(shù)。

語法:
arr.forEach(callback)剂桥。

參數(shù):
callback(val, index, arr) : 需要執(zhí)行的函數(shù)忠烛,接收三個(gè)參數(shù):

  • val : 正在處理的當(dāng)前元素;
  • index : 可選,正在處理的當(dāng)前元素的索引;
  • arr : 可選权逗,正在操作的數(shù)組;
let a = [1,3,5,7];
a.forEach(function(val, index, arr){
    arr[index] = val * 2
})
a ; // [2, 6, 10, 14]

4.2 every()

測(cè)試數(shù)組的所有元素是否都通過了指定函數(shù)的測(cè)試美尸。
語法:
arr.every(callback)

參數(shù):
callback(val, index, arr) : 需要執(zhí)行的函數(shù)斟薇,接收三個(gè)參數(shù):

  • val : 正在處理的當(dāng)前元素;
  • index : 可選火惊,正在處理的當(dāng)前元素的索引;
  • arr : 可選,正在操作的數(shù)組;

返回值:
若都通過返回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;  // true

4.3 some()

測(cè)試數(shù)組中的某些元素是否通過由提供的函數(shù)實(shí)現(xiàn)的測(cè)試尸疆。
語法:
arr.some(callback)椿猎。

參數(shù):
callback(val, index, arr) : 需要執(zhí)行的函數(shù)惶岭,接收三個(gè)參數(shù):

  • val : 正在處理的當(dāng)前元素;
  • index : 可選,正在處理的當(dāng)前元素的索引;
  • arr : 可選犯眠,正在操作的數(shù)組;

返回值:
若有一個(gè)通過返回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;  // true

4.4 filter()

將所有在過濾函數(shù)中返回 true 的數(shù)組元素放進(jìn)一個(gè)新數(shù)組中并返回筐咧。

語法:
arr.filter(callback)鸯旁。

參數(shù):
callback(val, index, arr) : 需要執(zhí)行的函數(shù),接收三個(gè)參數(shù):

  • val : 正在處理的當(dāng)前元素;
  • index : 可選量蕊,正在處理的當(dāng)前元素的索引;
  • arr : 可選铺罢,正在操作的數(shù)組;

返回值:
一個(gè)返回通過測(cè)試的元素的數(shù)組,若都沒有則返回空數(shù)組残炮。

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()

傳入一個(gè)操作函數(shù)韭赘,對(duì)每個(gè)元素執(zhí)行此方法,并返回一個(gè)執(zhí)行后的數(shù)組势就。

語法:
arr.map(callback)泉瞻。

參數(shù):
callback(val, index, arr) : 需要執(zhí)行的函數(shù),接收三個(gè)參數(shù):

  • val : 正在處理的當(dāng)前元素;
  • index : 可選苞冯,正在處理的當(dāng)前元素的索引;
  • arr : 可選袖牙,正在操作的數(shù)組;

返回值:
一個(gè)新數(shù)組,每個(gè)元素都是回調(diào)函數(shù)的結(jié)果舅锄。

let a = [1, 3, 5];
let b = a.map(function(val, index, arr){
    return val + 2;
})
b; //[3, 5, 7]

5. 數(shù)組的拓展(ES6)

5.1 拓展運(yùn)算符

拓展運(yùn)算符使用(...)鞭达,類似rest參數(shù)的逆運(yùn)算,將數(shù)組轉(zhuǎn)為用(,)分隔的參數(shù)序列巧娱。

console.log(...[1, 2, 3]);   // 1 2 3 
console.log(1, ...[2,3], 4); // 1 2 3 4

拓展運(yùn)算符主要使用在函數(shù)調(diào)用碉怔。

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

若拓展運(yùn)算符后面是個(gè)空數(shù)組,則不產(chǎn)生效果禁添。

[...[], 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]);

拓展運(yùn)算符的運(yùn)用

  • (1)復(fù)制數(shù)組
    通常我們直接復(fù)制數(shù)組時(shí)撮胧,只是淺拷貝,如果要實(shí)現(xiàn)深拷貝老翘,可以使用拓展運(yùn)算符芹啥。
// 通常情況 淺拷貝
let a1 = [1, 2];
let a2 = a1; 
a2[0] = 3;
console.log(a1,a2); // [3,2] [3,2]

// 拓展運(yùn)算符 深拷貝
let a1 = [1, 2];
let a2 = [...a1];
// let [...a2] = a1; // 作用相同
a2[0] = 3;
console.log(a1,a2); // [1,2] [3,2]
  • (2)合并數(shù)組
    注意,這里合并數(shù)組铺峭,只是淺拷貝墓怀。
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)與解構(gòu)賦值結(jié)合
    與解構(gòu)賦值結(jié)合生成數(shù)組,但是使用拓展運(yùn)算符需要放到參數(shù)最后一個(gè)卫键,否則報(bào)錯(cuò)傀履。
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()

類數(shù)組對(duì)象可遍歷的對(duì)象,轉(zhuǎn)換成真正的數(shù)組莉炉。

// 類數(shù)組對(duì)象
let a = {
    '0':'a',
    '1':'b',
    length:2
}
let arr = Array.from(a);

// 可遍歷的對(duì)象
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()

將一組數(shù)值钓账,轉(zhuǎn)換成數(shù)組碴犬,彌補(bǔ)Array方法參數(shù)不同導(dǎo)致的差異。

Array.of(1,2,3);    // [1,2,3]
Array.of(1).length; // 1

Array();       // []
Array(2);      // [,] 1個(gè)參數(shù)時(shí)梆暮,為指定數(shù)組長(zhǎng)度
Array(1,2,3);  // [1,2,3] 多于2個(gè)參數(shù)服协,組成新數(shù)組

5.4 find()和findIndex()

find()方法用于找出第一個(gè)符合條件的數(shù)組成員,參數(shù)為一個(gè)回調(diào)函數(shù)啦粹,所有成員依次執(zhí)行該回調(diào)函數(shù)偿荷,返回第一個(gè)返回值為true的成員,如果沒有一個(gè)符合則返回undefined唠椭。

[1,2,3,4,5].find( a => a < 3 ); // 1

回調(diào)函數(shù)接收三個(gè)參數(shù)跳纳,當(dāng)前值、當(dāng)前位置和原數(shù)組泪蔫。

[1,2,3,4,5].find((value, index, arr) => {
    // ...
});

findIndex()方法與find()類似棒旗,返回第一個(gè)符合條件的數(shù)組成員的位置,如果都不符合則返回-1撩荣。

[1,2,3,4].findIndex((v,i,a)=>{
    return v>2;
}); // 2

5.5 fill()

用于用指定值填充一個(gè)數(shù)組铣揉,通常用來初始化空數(shù)組,并抹去數(shù)組中已有的元素餐曹。

new Array(3).fill('a');   // ['a','a','a']
[1,2,3].fill('a');        // ['a','a','a']

并且fill()的第二個(gè)和第三個(gè)參數(shù)指定填充的起始位置結(jié)束位置逛拱。

[1,2,3].fill('a',1,2);//  [1, "a", 3]

5.6 entries(),keys(),values()

主要用于遍歷數(shù)組,entries()對(duì)鍵值對(duì)遍歷台猴,keys()對(duì)鍵名遍歷朽合,values()對(duì)鍵值遍歷。

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()

用于表示數(shù)組是否包含給定的值饱狂,與字符串的includes方法類似曹步。

[1,2,3].includes(2);     // true
[1,2,3].includes(4);     // false
[1,2,NaN].includes(NaN); // true

第二個(gè)參數(shù)為起始位置,默認(rèn)為0休讳,如果負(fù)數(shù)讲婚,則表示倒數(shù)的位置,如果大于數(shù)組長(zhǎng)度俊柔,則重置為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);   // true

5.8 flat(),flatMap()

flat()用于將數(shù)組一維化,返回一個(gè)新數(shù)組雏婶,不影響原數(shù)組物赶。
默認(rèn)一次只一維化一層數(shù)組,若需多層留晚,則傳入一個(gè)整數(shù)參數(shù)指定層數(shù)酵紫。
若要一維化所有層的數(shù)組,則傳入Infinity作為參數(shù)。

[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()是將原數(shù)組每個(gè)對(duì)象先執(zhí)行一個(gè)函數(shù)奖地,在對(duì)返回值組成的數(shù)組執(zhí)行flat()方法状蜗,返回一個(gè)新數(shù)組,不改變?cè)瓟?shù)組鹉动。
flatMap()只能展開一層。

[2, 3, 4].flatMap((x) => [x, x * 2]); 
// [2, 4, 3, 6, 4, 8] 

6. 數(shù)組的拓展(ES7)

6.1 Array.prototype.includes()方法

includes()用于查找一個(gè)值是否在數(shù)組中宏邮,如果在返回true泽示,否則返回false

['a', 'b', 'c'].includes('a');     // true
['a', 'b', 'c'].includes('d');     // false

includes()方法接收兩個(gè)參數(shù)蜜氨,搜索的內(nèi)容開始搜索的索引械筛,默認(rèn)值為0,若搜索值在數(shù)組中則返回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方法對(duì)比埋哟,下面方法效果相同:

['a', 'b', 'c', 'd'].indexOf('b') > -1;  // true
['a', 'b', 'c', 'd'].includes('b');      // true 

includes()與indexOf對(duì)比:

  • includes相比indexOf更具語義化,includes返回的是是否存在的具體結(jié)果郎汪,值為布爾值赤赊,而indexOf返回的是搜索值的下標(biāo)。
  • includes相比indexOf更準(zhǔn)確煞赢,includes認(rèn)為兩個(gè)NaN相等抛计,而indexOf不會(huì)。
let a = [1, NaN, 3];
a.indexOf(NaN);     // -1
a.includes(NaN);    // true

另外在判斷+0-0時(shí)照筑,includesindexOf的返回相同吹截。

[1, +0, 3, 4].includes(-0);   // true
[1, +0, 3, 4].indexOf(-0);    // 1

參考資料

1.MDN 索引集合類
2.MDN 數(shù)組對(duì)象
3.W3school JavaScript Array 對(duì)象


本部分內(nèi)容到這結(jié)束

Author 王平安
E-mail pingan8787@qq.com
博 客 www.pingan8787.com
微 信 pingan8787
每日文章推薦 https://github.com/pingan8787/Leo_Reading/issues
JS小冊(cè) js.pingan8787.com
微信公眾號(hào)【前端自習(xí)課】
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市凝危,隨后出現(xiàn)的幾起案子波俄,更是在濱河造成了極大的恐慌,老刑警劉巖蛾默,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件懦铺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡趴生,警方通過查閱死者的電腦和手機(jī)阀趴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苍匆,“玉大人刘急,你說我怎么就攤上這事〗龋” “怎么了叔汁?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我据块,道長(zhǎng)码邻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任另假,我火速辦了婚禮像屋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘边篮。我一直安慰自己己莺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布戈轿。 她就那樣靜靜地躺著凌受,像睡著了一般。 火紅的嫁衣襯著肌膚如雪思杯。 梳的紋絲不亂的頭發(fā)上胜蛉,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音色乾,去河邊找鬼誊册。 笑死,一個(gè)胖子當(dāng)著我的面吹牛杈湾,可吹牛的內(nèi)容都是我干的解虱。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼漆撞,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼殴泰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起浮驳,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤悍汛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后至会,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體离咐,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年奉件,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宵蛀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡县貌,死狀恐怖术陶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情煤痕,我是刑警寧澤梧宫,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布接谨,位于F島的核電站,受9級(jí)特大地震影響塘匣,放射性物質(zhì)發(fā)生泄漏脓豪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一忌卤、第九天 我趴在偏房一處隱蔽的房頂上張望扫夜。 院中可真熱鬧,春花似錦驰徊、人聲如沸历谍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至印蔬,卻和暖如春勋桶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侥猬。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工例驹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人退唠。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓鹃锈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瞧预。 傳聞我的和親對(duì)象是個(gè)殘疾皇子屎债,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載:在開發(fā)中盆驹,數(shù)組的使用場(chǎng)景非常多,平日中也涉及到很多數(shù)組的api/相關(guān)操作滩愁,一直也沒有對(duì)這塊內(nèi)容進(jìn)行一塊整理總...
    七色煙火閱讀 3,212評(píng)論 0 3
  • Javascript有很多數(shù)組的方法躯喇,有的人有W3C的API,還可以去MDN上去找硝枉,但是我覺得API上說的不全廉丽,M...
    頑皮的雪狐七七閱讀 4,071評(píng)論 0 6
  • The JavaScriptArrayobject is a global object thatis used ...
    skycolor閱讀 562評(píng)論 0 0
  • 總目錄 上一章 灣陸醫(yī)院8樓。 中午時(shí)分妻味。依舊沒有見到邊婷的影子正压。龍華生、吳凱急的團(tuán)團(tuán)轉(zhuǎn)弧可。跟護(hù)士要人嗎蔑匣?那個(gè)當(dāng)...
    委子閱讀 270評(píng)論 2 6
  • 在iOS中框架是一個(gè)目錄劣欢,包含了共享資源庫,用于訪問該資源庫中儲(chǔ)存的代碼的頭文件裁良,以及圖像凿将、聲音文件等其他資源。共...
    ch123閱讀 1,776評(píng)論 0 1