JavaScript 數組 API 全解析

在編程世界中,數組是指元素的集合。數組將數據作為元素進行存儲,并在需要時將其取出。

在支持數組的編程語言中廣泛地采用了這個數據結構。

這個手冊會介紹 JavaScript 數組的所有知識。你將會學到復雜數據處理、解構、常用數組方法等內容。

我為什么寫這篇文章

網上已經有很多介紹 JavaScript 數組的優秀文章,那我為什么還要寫一篇相同主題的文章呢?動機是什么?

多年來,通過和學員的交流,我意識到大多數初學者都需要這樣一個教程:通過示例從頭到尾徹底地介紹數組。

所以我決定編寫這樣一篇包含大量示例的文章。如果你是初學者,希望這篇文章對你有所幫助。

不過,這個手冊也能幫助有經驗的開發者梳理知識。我在寫作這篇文章的過程中,也重新學習了相關知識。我們開始吧。

JavaScript 中的數組是什么

在 JavaScript 中,一對方括號([]) 表示一個數組,其中的所有元素以逗號(,) 分隔。

在 JavaScript 中,數組可以是任意類型元素組成的集合。這意味著,創建一個數組,它的元素類型可以是 String、Boolean、Number、Object,甚至是另一個數組。

示例中的數組包含 4 個元素,類型分別是:Number、Boolean、String 和 Object。

const?mixedTypedArray?=?[100,?true,?'freeCodeCamp',?{}];

元素在數組中的位置稱為索引(index),JavaScript 中的數組索引是從 0 開始計數的,每加入一個新元素,其對應的索引加 1。

例如,上面的數組中,100 這個元素的位置是 索引 0true 的位置是索引 1'freeCodeCamp' 的位置是索引 2,以此類推。

數組中的元素數量決定了數組長度(length)。比如說,上面的數組長度是 4。

有趣的是,JavaScript 數組的長度是可變的,你可以隨時將它指定為一個非負整數值。我們稍后會學習更多相關知識。

如何創建數組

在 JavaScript 中有多種方式可以創建數組,最直接的方式是把數組字面量賦值給一個變量。

const?salad?=?['????',?'????',?'????',?'????',?'????',?'????',?'????'];

也可以使用 Array 構造函數來創建數組。

const?salad?=?new?Array('????',?'????',?'????',?'????',?'????',?'????',?'????');

注意:new Array(2) 會創建一個長度為 2 的空數組,然而 new Array(1,2) 則會創建一個包含兩個元素(1 和 2)的數組。

另外,Array.of()Array.from() 方法,以及展開運算符(...)也可以創建數組。我們后面會學習它們。

如何訪問數組元素

可以使用數組索引來獲取數組元素,訪問數組元素需要用到方括號 []

const?element?=?array[index];

根據使用場景,你可能需要一個一個地訪問數組元素或者使用循環來遍歷。

可以像這樣使用索引來訪問數組元素:

const?salad?=?['????',?'????',?'????',?'????',?'????',?'????',?'????'];
salad[0];?//?'????'
salad[2];?//?'????'
salad[5];?//?'????'

也可以利用數組長度(length 屬性)值,反向遍歷訪問數組元素。

const?salad?=?['????',?'????',?'????',?'????',?'????',?'????',?'????'];
const?len?=?salad.length;
salad[len?-?1];?//?'????'
salad[len?-?3];?//?'????'

可以使用一般的 for 循環或 forEach 方法來遍歷數組,也可以使用其它方式來遍歷。

const?salad?=?['????',?'????',?'????',?'????',?'????',?'????',?'????'];for(let?i=0;?i<salad.length;?i++)?{console.log(`Element?at?index?${i}?is?${salad[i]}`);
}

結果如下:

如何向數組中添加元素

可以使用 push() 方法向數組中插入一個元素,它會將元素追加到數組的末尾。我們往沙拉中加入一些花生:

const?salad?=?['????',?'????',?'????',?'????',?'????',?'????',?'????'];
salad.push('????');

現在沙拉數組看起來像這樣:

["????", "????", "????", "????", "????", "????", "????", "????"]

注意,push() 方法會把元素追加到數組末尾,如果想要在數組頭部插入一個元素,需要使用 unshift() 方法。

const?salad?=?['????',?'????',?'????',?'????',?'????',?'????',?'????'];
salad.unshift('????');

現在沙拉數組看起來像這樣:

["????", "????", "????", "????", "????", "????", "????", "????"]

如何移除數組元素

移除單個數組元素的最簡單方式是使用 pop() 方法。每次調用 pop() 方法,都會移除數組末尾的那個元素。pop() 方法的返回值是那個被移除的元素,這個方法會改變原始數組。

const?salad?=?['????',?'????',?'????',?'????',?'????',?'????',?'????'];
salad.pop();?//?????console.log(salad);?//?['????',?'????',?'????',?'????',?'????',?'????']

使用 shift() 方法可以移除數組頭部的一個元素。與 pop() 方法類似,shift() 方法會返回那個被移除的元素,并且會改變原始數組。

const?salad?=?['????',?'????',?'????',?'????',?'????',?'????',?'????'];
salad.shift();?//?????console.log(salad);?//?['????',?'????',?'????',?'????',?'????',?'????'];

如何克隆數組

可以使用 slice() 方法來克隆數組。注意,slice() 方法不改變原始數組,而是創建一個原始數組的淺拷貝副本。

const?salad?=?['????',?'????',?'????',?'????',?'????',?'????',?'????'];
const?saladCopy?=?salad.slice();console.log(saladCopy);?//?['????',?'????',?'????',?'????',?'????',?'????',?'????']salad?===?saladCopy;?//?returns?false

也可以使用展開運算符來創建數組副本,我們很快會學到。

如何判斷某個值是不是數組

可以使用 Array.isArray(value) 方法來判斷某個值是不是數組,如果傳入的值是一個數組的話,它會返回 true。

Array.isArray(['????',?'????',?'????',?'????',?'????',?'????',?'????']);?//?returns?true
Array.isArray('????');?//?returns?false
Array.isArray({?'tomato':?'????'});?//?returns?false
Array.isArray([]);?//?returns?true

數組解構

ECMAScript 6(ES6)提供了一些新語法,可以一次性從數組中獲取多個元素并賦值給多個變量。它有助于保持代碼簡潔明了。這個新語法被稱為解構語法。

下面是使用解構語法從數組中獲取多個元素的例子:

let?[tomato,?mushroom,?carrot]?=?['????',?'????',?'????'];

現在就可以使用這些變量了:

console.log(tomato,?mushroom,?carrot);?//?Output,???????????????

如果不使用解構語法的話,代碼會是這樣:

let?vegetables?=?['????',?'????',?'????'];
let?tomato?=?vegetables[0];
let?mushroom=?vegetables[1];
let?carrot=?vegetables[2];

所以,解構語法能夠有助于減少代碼量、極大地提高生產力。

如何為變量指定默認值

使用解構語法時,可以為變量指定默認值,當數組中沒有對應的元素或者元素的值為 undefined 時,就會使用默認值。

下面的例子中,我們為 mushroom 變量指定了一個默認值。

let?[tomato?,?mushroom?=?'????']?=?['????'];
console.log(tomato);?//?'????'
console.log(mushroom?);?//?'????'

如何跳過某個數組元素

使用解構獲取數組元素時,可以跳過某個元素。比如說,你可能只關注數組的部分元素,這時候這個語法就派上用場了。

下面的例子中,我們跳過了“蘑菇”元素。注意表達式左邊變量聲明中的空格。

let?[tomato,?,?carrot]?=?['????',?'????',?'????'];console.log(tomato);?//?'????'
console.log(carrot);?//?'????'

嵌套數組解構

JavaScript 中,數組是可以嵌套的。這意味著一個數組的元素可以是另一個數組。數組可以嵌套任意深度。

例如,我們創建一個嵌套數組 fruits,其元素包含一些水果和一個“蔬菜”數組。

let?fruits?=?['????',?'????',?'????',?'????',?['????',?'????',?'????']];

要如何獲取以上數組中的 '????' 呢?同樣的,不使用解構的話,可以這樣做:

const?veg?=?fruits[4];?//?returns?the?array?['????',?'????',?'????']
const?carrot?=?veg[2];?//?returns?'????'

或者,也可以使用簡寫語法:

fruits[4][2];?//?returns?'????'

還可以使用解構語法:

let?[,,,,[,,carrot]]?=?['????',?'????',?'????',?'????',?['????',?'????',?'????']];

如何使用展開語法(Spread Syntax)和剩余參數(Rest Parameter)

從 ES6 開始,通過 ...(連續的三個點)可以在數組解構中使用展開語法和剩余參數。

  • 使用剩余參數時,... 出現在解構語法表達式的左邊。

  • 使用展開語法時,... 出現在解構語法表達式的右邊。

如何使用剩余參數

通過剩余參數,可以將剩下的元素映射到一個新的數組中。剩余參數必須是解構語法中的最后一個變量。

下面的例子中,我們把數組的前兩個參數分別映射到了 tomato 和 mushroom 變量中,剩下的元素則使用 ... 映射到了 rest 變量中。rest 是一個新數組,其中包含了剩下的元素。

const?[tomato,?mushroom,?...rest]?=?['????',?'????',?'????',?'????',?'????',?'????',?'????'];console.log(tomato);?//?'????'
console.log(mushroom);?//?'????'
console.log(rest);?//?["????",?"????",?"????",?"????",?"????"]

如何使用展開運算符

使用展開運算符,可以這樣來克隆現有的數組:

const?salad?=?['????',?'????',?'????',?'????',?'????',?'????',?'????'];const?saladCloned?=?[...salad];
console.log(saladCloned);?//?["????",?"????",?"????",?"????",?"????",?"????",?"????"]salad?===?saladCloned?//?false

解構的使用場景

我們一起來看看數組解構、展開運算符和剩余參數的一些激動人心的使用場景。

使用解構交換變量值

使用數組解構語法可以很輕松地交換兩個變量的值。

let?first?=?'????';
let?second?=?'????';
[first,?second]?=?[second,?first];console.log(first);??//?'????'
console.log(second);?//?'????'

合并數組

我們可以通過合并兩個數組的所有元素來創建一個新數組(不改變原始數組)。假設現在有兩個數組——一個包含一些笑臉,另一個包含一些蔬菜。

const?emotion?=?['????',?'????'];
const?veggies?=?['????',?'????',?'????',?'????'];

現在,我們要把它們合并成一個新數組。

const?emotionalVeggies?=?[...emotion,?...veggies];
console.log(emotionalVeggies);?//?["????",?"????",?"????",?"????",?"????",?"????"]

JavaScript 數組方法

到目前為止,我們已經了解了一些數組屬性和方法。我們做一個簡單的回顧:

  • push() – 在數組末尾插入一個元素。

  • unshift() – 在數組頭部插入一個元素。

  • pop() – 移除數組末尾的最后一個元素。

  • shift() – 移除數組頭部的第一個元素。

  • slice() – 創建數組的淺拷貝副本。

  • Array.isArray() – 判斷某個值是不是數組。

  • length – 數組的長度。

現在我們將通過示例來學習其它重要的數組方法。

如何創建數組、刪除數組元素、更新數組元素以及訪問數組元素

這一節,我們要學習用于創建新數組、移除數組元素及清空數組、訪問數組元素等操作的方法。

concat() 方法

concat() 方法可以將多個數組合并在一起并返回合并后的數組。這是一個不可變方法,意味著它不會改變現有的數組。

拼接兩個數組:

const?first?=?[1,?2,?3];
const?second?=?[4,?5,?6];const?merged?=?first.concat(second);console.log(merged);?//?[1,?2,?3,?4,?5,?6]
console.log(first);?//?[1,?2,?3]
console.log(second);?//?[4,?5,?6]

使用 concat() 方法也可以拼接兩個以上的數組。我們可以這樣拼接任意數量的數組:

array.concat(arr1,?arr2,..,..,..,arrN);

示例如下:

const?first?=?[1,?2,?3];
const?second?=?[4,?5,?6];
const?third?=?[7,?8,?9];const?merged?=?first.concat(second,?third);console.log(merged);?//?[1,?2,?3,?4,?5,?6,?7,?8,?9]

join() 方法

join() 方法使用一個分隔符將數組的所有元素拼接成一個字符串,并返回這個字符串。默認的分隔符是逗號(,)。

const?emotions?=?['????',?'????',?'????',?'????'];const?joined?=?emotions.join();
console.log(joined);?//?"????,????,????,????"

可以傳入一個自定義分隔符用于拼接數組元素。下面是一個使用自定義分隔符拼接數組元素的例子:

const?joined?=?emotions.join('<=>');
console.log(joined);?//?"????<=>????<=>????<=>????"

在空數組上調用 join() 方法,返回一個空字符串:

[].join()?//?returns?""

fill() 方法

fill() 方法使用一個固定值填充數組。可以使用這個固定值填充整個數組,也可以只覆蓋選定的元素。注意,fill() 方法會改變原始數組。

const?colors?=?['red',?'blue',?'green'];colors.fill('pink');
console.log(colors);?//?["pink",?"pink",?"pink"]

下面是一個使用 fill() 方法覆蓋數組的最后兩個元素的例子:

const?colors?=?['red',?'blue',?'green'];colors.fill('pink',?1,3);?//?["red",?"pink",?"pink"]

這個例子中,fill() 方法的第一個參數是用來填充數組的值,第二個參數是替換的起始索引(從 0 開始計算),最后一個參數是終止索引(最大值可以是 colors.length)。

請查看這個 Twitter 主題以了解 fill() 方法的實際用法。

你也可以查看這個示例項目:https://github.com/atapas/array-fill-color-cards。

includes() 方法

可以使用 includes() 方法來判斷一個數組中是否包含某個元素,如果包含則返回 true,否則返回 false

const?names?=?['tom',?'alex',?'bob',?'john'];names.includes('tom');?//?returns?true
names.includes('july');?//?returns?false

indexOf() 方法

可以使用 indexOf() 方法找到某個元素在數組中的索引位置。它返回這個元素在數組中首次出現的索引,如果沒有找到這個元素則返回 -1

const?names?=?['tom',?'alex',?'bob',?'john'];names.indexOf('alex');?//?returns?1
names.indexOf('rob');?//?returns?-1

還有一個 lastIndexOf() 方法,可以找出某個元素在數組中最后出現的位置。與 indexOf() 類似,lastIndexOf() 在找不到這個元素時也返回 -1

const?names?=?['tom',?'alex',?'bob',?'tom'];names.indexOf('tom');?//?returns?0
names.lastIndexOf('tom');?//?returns?3

reverse() 方法

顧名思義,reverse() 方法將數組中元素的位置顛倒,最后一個元素變成第一個、第一個元素變成最后一個。

const?names?=?['tom',?'alex',?'bob'];names.reverse();?//?returns?["bob",?"alex",?"tom"]

reverse() 方法會改變原始數組。

sort() 方法

sort() 方法可能是最常用的數組方法之一。sort() 方法默認會把元素轉換為字符串再對它們進行排序。默認的排序方式是升序排列。sort() 方法會改變原始數組。

const?names?=?['tom',?'alex',?'bob'];names.sort();?//?returns?["alex",?"bob",?"tom"]

sort() 方法接收一個可選的比較器函數作為參數,可以編寫一個比較器函數傳入 sort() 方法來覆蓋默認的排序行為。

假設現在有一個數字數組,我們使用比較器函數將它按升序和降序排序:

const?numbers?=?[23,?5,?100,?56,?9,?13,?37,?10,?1]

首先,調用 sort() 方法,并觀察結果:

numbers.sort();

現在,排序后的數組為 [1, 10, 100, 13, 23, 37, 5, 56, 9]。這并不是我們預期的結果。得到這個結果是因為 sort() 方法默認會將元素轉換為字符串,再基于字符串諸個字符對應的 UTF-16 編碼值進行比較。

為了解決這個問題,我們編寫一個比較器函數。這是用于升序排序的:

function?ascendingComp(a,?b){return?(a-b);
}

把比較器函數傳入 sort() 方法:

numbers.sort(ascendingComp);?//?retruns?[1,?5,?9,?10,?13,?23,?37,?56,?100]/*?也可以使用行內函數:numbers.sort(function(a,?b)?{return?(a-b);
});或者使用箭頭函數的寫法:numbers.sort((a,?b)?=>?(a-b));*/

降序排序:

numbers.sort((a,?b)?=>?(b-a));

查看這個 GitHub 倉庫以獲取更多排序示例和技巧:https://github.com/atapas/js-array-sorting。

splice() 方法

splice() 方法可以幫助你向數組中添加元素、更新數組元素以及移除數組元素。剛開始接觸這個方法可能會令人困惑,不過只要你理解了它的正確用法,就能夠掌握。

splice() 方法的主要目標是從數組中移除元素。它會返回由被移除的元素組成的數組,并且會改變原始數組。你也可以用它來向數組中添加元素或者替換數組中的元素。

使用 splice() 方法向數組中添加一個元素,需要傳入插入的目標位置、從目標位置算起想要刪除的元素數量以及要插入的元素。

下面的例子中,我們在索引為 1 的位置上插入了一個元素 zack,沒有刪除任何元素。

const?names?=?['tom',?'alex',?'bob'];names.splice(1,?0,?'zack');console.log(names);?//?["tom",?"zack",?"alex",?"bob"]

看看下面的例子,我們移除了索引 2 位置之后的一個元素(即第三個元素),并添加了一個元素 zacksplice() 方法返回一個由移除掉的元素——bob——組成的數組。

const?names?=?['tom',?'alex',?'bob'];const?deleted?=?names.splice(2,?1,?'zack');console.log(deleted);?//?["bob"]
console.log(names);?//?["tom",?"alex",?"zack"]

查看這個 Twitter 主題以了解如何使用 splice() 方法清空數組。

靜態數組方法

在 JavaScript 中,數組有三個靜態方法。我們已經討論過 Array.isArray(),接下來要探討其余兩個方法。

Array.from() 方法

假設有以下 HTML 代碼片段,其中包含一個 div 和一些列表元素:

<div?id="main"><ul><ol?type="1"><li>...</li><li>...</li><li>...</li><li>...</li><li>...</li><li>...</li><li>...</li><li>...</li><li>...</li><li>...</li></ol></ul>?
</div>

我們使用 getElementsByTagName() 方法獲取這些列表元素。

document.getElementsByTagName('li');

它返回如下 HTMLCollection 對象:

HTMLCollection 是類數組對象

它和數組類似,我們試著使用 forEach 來遍歷它:

document.getElementsByTagName('li').forEach(()?=>?{//?Do?something?here..
})

猜猜會輸出什么?會報出以下錯誤:

在類數組對象上調用 forEach 發生錯誤


為什么會這樣?這是因為 HTMLCollection 并不是數組,而是 類數組 對象,所以不能使用 forEach 來遍歷它。

其原型(proto)是 Object

這里就需要用到 Array.from() 方法了,Array.from() 能將類數組對象轉換為數組,進而能夠在它上面執行所有數組操作。

const?collection?=?Array.from(document.getElementsByTagName('li'))

這里的 collection 是一個數組:

其原型為 Array

Array.of() 方法

Array.of() 可以使用任意數量任意類型的元素創建一個新數組。

Array.of(2,?false,?'test',?{'name':?'Alex'})

輸出如下:

Array.of() 方法的輸出結果

數組迭代器方法

現在我們要學習數組迭代器方法。這些方法在執行數組迭代、計算、做判斷、過濾元素等操作時很有用。

到目前為止,我們還沒見過對象數組的示例。在這一節,我們將會使用下面的對象數組來解釋和演示這些迭代器方法。

這個數組包含了一些訂閱各種付費課程的學生的信息:

let?students?=?[{'id':?001,'f_name':?'Alex','l_name':?'B','gender':?'M','married':?false,'age':?22,'paid':?250,??'courses':?['JavaScript',?'React']},{'id':?002,'f_name':?'Ibrahim','l_name':?'M','gender':?'M','married':?true,'age':?32,'paid':?150,??'courses':?['JavaScript',?'PWA']},{'id':?003,'f_name':?'Rubi','l_name':?'S','gender':?'F','married':?false,'age':?27,'paid':?350,??'courses':?['Blogging',?'React',?'UX']},{'id':?004,'f_name':?'Zack','l_name':?'F','gender':?'M','married':?true,'age':?36,'paid':?250,??'courses':?['Git',?'React',?'Branding']}?
];

讓我們開始吧。所有數組迭代器方法都接收一個函數作為參數,需要在這個函數中聲明迭代邏輯。

filter() 方法

filter() 方法用所有滿足過濾條件的元素來創建一個新數組。我們要找出女學生,所以過濾條件應該是 gender === 'F'

const?femaleStudents?=?students.filter((element,?index)?=>?{return?element.gender?===?'F';
})console.log(femaleStudents);

輸出如下:

結果是正確的,名為 Rubi 的學生是目前唯一的女學生。

map()方法

map() 方法遍歷整個數組,依次對數組元素執行回調函數并用這些返回值創建一個新數組。我們將會創建一個由 students 數組中所有學生的全名組成的新數組。

const?fullNames?=?students.map((element,?index)?=>?{return?{'fullName':?element['f_name']?+?'?'?+?element['l_name']}
});console.log(fullNames);

輸出如下:

這里我們可以看到由包含 fullName 屬性的對象組成的數組,fullName 是由 student 對象的 f_namel_name 屬性計算得到的。

reduce() 方法

reduce() 方法對每個數組元素執行 reducer 函數,并將其結果匯總為單個返回值。我們將會在 students 數組中應用一個 reducer 函數來計算所有學生支付的總額。

const?total?=?students.reduce((accumulator,?student,?currentIndex,?array)?=>?{accumulator?=?accumulator?+?student.paid;return?(accumulator);},?
0);console.log(total);?//?1000

在上面的代碼中,

  • 我們將累加器(accumulator)初始化為 0

  • 我們對每個 student 對象執行 reduce 方法,讀取 paid 屬性值并把它累加在累加器上。

  • 最后,返回累加器。

some() 方法

some() 方法返回一個布爾值(true/false),其返回值取決于數組中是否至少有一個元素符合回調函數中的判斷條件。我們來看看是否有學生的年齡小于 30 歲。

let?hasStudentBelow30?=?students.some((element,?index)?=>?{return?element.age?<?30;
});console.log(hasStudentBelow30);?//?true

是的,我們看到至少有一個學生的年齡是小于 30 歲的。

find() 方法

使用 some() 方法,我們已經看到有一個 30 歲以下的學生。讓我們找出這個學生。

為此,我們會用到 find() 方法,它會返回數組中第一個滿足判斷條件的元素。

還有另一個相關的方法 findIndex(),這個方法返回我們使用 find() 方法找到的元素的索引,如果沒有符合條件的元素則返回 -1

下面的例子中,我們向 find() 方法中傳入了一個函數用來判斷學生的年齡,它會返回滿足判斷條件的學生。

const?student?=?students.find((element,?index)?=>?{return?element.age?<?30;
});console.log(student);

輸出如下:

可以看到,他就是 22 歲的 Alex,我們找到他了。

every() 方法

every() 方法檢查是否數組的每個元素都滿足給定的判斷條件。讓我們檢查一下是不是所有學生都訂閱了至少兩門課程。

const?atLeastTwoCourses?=?students.every((elements,?index)?=>?{return?elements.courses.length?>=?2;
});console.log(atLeastTwoCourses);?//?true

正如預期,我們看到結果為 true

提案中的方法

截至 2021 年 5 月,ECMAScript 提案中有一個新的數組方法,即 at() 方法。

at() 方法

提案中的 at() 方法可以讓你使用負數索引來訪問數組元素(譯注:使用負數索引即從數組末尾開始訪問元素,-1 表示最后一個元素、-2 表示倒數第二個元素……以此類推)。截至目前,這個方法還不可用。現在只能使用正數索引從數組開頭訪問元素。

目前想從數組末尾開始訪問數組元素要借助 length 屬性。通過引入 at() 方法,就可以在單個方法里面使用正數索引或者負數索引來訪問元素。

const?junkFoodILove?=?['????',?'????',?'????',?'????',?'????',?'????',?'????',?'????'];junkFoodILove.at(0);?//?????
junkFoodILove.at(3);?//?????
junkFoodILove.at(-1);?//?????
junkFoodILove.at(-5);?//?????
junkFoodILove.at(-8);?//?????
junkFoodILove.at(10);?//?undefined

這是一個簡單示例:

JavaScript at() 方法示例

at() 方法加入 JavaScript 語言之前,你可以使用這個 polyfill 來獲得它的功能。查看這個 GitHub 倉庫以獲取 at() 方法的示例:https://github.com/atapas/js-array-at-method。

結束之前......

希望你覺得這篇文章有價值,也希望它能夠幫助你更好地理解 JavaScript 數組。請多多練習文中的示例,以便更好地掌握它們。你可以在我的 GitHub 倉庫中找到所有代碼示例。

保持聯系,我平時活躍在 Twitter (@tapasadhikary),歡迎關注我。

推薦閱讀:

  • 為什么需要了解類數組對象?

  • 關于 JavaScript 排序方法(sort)的 5 個實用技巧

  • JavaScript 中清空數組的各種方式及其后果

  • 使用 map、reduce、filter 和其它數組迭代器增強你的 JavaScript 水平

  • 為什么需要了解 JavaScript 數組的 at() 方法?


原文鏈接:https://www.freecodecamp.org/news/the-javascript-array-handbook/

作者:TAPAS ADHIKARY

譯者:Humilitas


最近組建了一個江西人的前端交流群,如果你是江西人可以加我微信?ruochuan12?私信 江西?拉你進群。


推薦閱讀

我在阿里招前端,該怎么幫你(可進面試群)
畢業年限不長的前端焦慮和突破方法

前端搶飯碗系列之Vue項目如何做單元測試
老姚淺談:怎么學JavaScript?

·················?若川簡介?·················

你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列》多篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結,已經寫了7篇,點擊查看年度總結。
同時,活躍在知乎@若川,掘金@若川。致力于分享前端開發經驗,愿景:幫助5年內前端人走向前列。

點擊方卡片關注我、加個星標

今日話題

略。歡迎分享、收藏、點贊、在看我的公眾號文章~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275682.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275682.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275682.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spoken English(001)

if he wants to make any changes,minor alternations can be made thenis there any way of ensuring well have enough time for our talks?so our evenings will be quite full then?We’ll leave some evenings free,that is, if it is all right with you.We’d have to…

美學設計評價_死亡的孩子無法使用的設計美學

美學設計評價In the popular anime series, Soul Eater, Death the Kid is a Shinigami (Japanese death god) who vanquishes evil with his dual pistols, Liz and Patty. Although he’s strikingly powerful, his battles are often hindered by his obsessive-compulsive …

iis php網站500錯誤原因_因為曾經錯誤安裝過PHP5.2而導致IIS7無法正常工作,顯示500錯誤提示,大家幫忙看看!...

我的系統是VISTA,使用自帶的IIS7&#xff0c;對ASP網頁一直瀏覽正常。最近因自己心血來潮錯誤安裝了一次PHP5.2。主要操作是&#xff1a;1、下載的是自動安裝的PHP5.2程序&#xff0c;自動選ISAPI按鈕安裝&#xff1b;2、對IIS7中添加了名為“PHP”的ISAPI篩選器&#xff0c;選…

【送書】2021年哪些好書值得讀(小姐姐配音)

大家好&#xff0c;我是若川。記得點上面的小姐姐再次錄制的配音。為感謝大家一直以來的支持和肯定。不知道是今年第幾次送書了。昨天送書的音頻廣受好評&#xff0c;沒參與的可以參與。今天聯合華章圖書再送文中任選一本 * 3 包郵送&#xff0c;詳細規則看文末。Web開發01《斯…

Flash獲取html參數的方法

一. swf?傳參 html代碼:代碼<html><head><meta http-equiv”Content-Type” content”text/html charsetutf-8″ /><title>as</title></head><body><object classid”clsid:D27CDB6E-AE6D-11cf-96B8-444553540000″ codebase”h…

方法重載_方法

方法重載Recently, I wrote an article about moving XD designs to Figma. It was a really interesting experiment and one that seemed to interest quite a lot of people.最近&#xff0c;我寫了一篇有關將XD設計移至Figma的文章。 這是一個非常有趣的實驗&#xff0c;似…

php strtoup,PHP 7 的幾處函數安全小變化

To Begin With最近在準備 LANCTF&#xff0c;想把環境遷移到 PHP 7&#xff0c;卻想到一些 payload 失效了。想著什么時候總結成一個筆記&#xff0c;恰巧在 FB 發現有人寫了一篇博文&#xff0c;拜讀后結合 CTF 環境整理了一下&#xff0c;總體來說&#xff0c;棄用了較多不安…

Node.js 框架設計及企業 Node.js 基礎建設相關討論

大家好&#xff0c;我是若川。19年我寫的 lodash源碼 文章投稿到海鏡大神知乎專欄竟然通過了&#xff0c;后來20年海鏡大神還star了我的博客&#xff0c;同時還轉發了我的微博。時間真快啊。今天分享這篇Node.js的討論。2021 年上半年早已過去&#xff0c;回顧 Node.js 在國內的…

DAS、NAS、SAN、iSCSI 存儲方案概述

目前服務器所使用的專業存儲方案有DAS、NAS、SAN、iSCSI幾種。存儲根據服務器類型可以分為&#xff1a;封閉系統的存儲和開放系統的存儲&#xff1a; &#xff08;1&#xff09;封閉系統主要指大型機. &#xff08;2&#xff09;開放系統指基于包括Windows、UNIX、Linux等操作系…

同態加法_同態—當舊趨勢突然變酷時

同態加法Designers get excited at every year’s end to see what next year’s trend is going to be. What the future of design is going to look like. What they can carry forward to the next year; And Neumorphism was one among the lists which gained great atte…

網頁標題設置,為什么在SERP中,顯示結果不一致?

在網站建設與運營的過程中&#xff0c;我們經常會遇到各種各樣的問題&#xff0c;特別是關于網頁標題設置的問題&#xff0c;如果一個頁面標題出錯&#xff0c;那么&#xff0c;你整個頁面建設的過程&#xff0c;就完全是事倍功半&#xff0c;得不償失。 那么&#xff0c;網頁標…

阿里專有釘釘前端面試指南

大家好&#xff0c;我是若川。今天推薦這篇掘金高贊文章&#xff0c;歡迎留言交流。經作者子奕大佬授權轉載&#xff0c;原文鏈接&#xff1a;https://juejin.cn/post/6986436944913924103作者介紹子弈[1]&#xff0c;專有釘釘前端團隊成員&#xff0c;負責專有釘釘 PC 客戶端的…

安全態勢感知產品對比_設計中的對比和人的感知

安全態勢感知產品對比In this article, we’re going to explore the concept of contrast and its fundamental role in UX and visual design.在本文中&#xff0c;我們將探討對比度的概念及其在UX和視覺設計中的基本作用。 Let’s start by defining what contrast is.讓我…

在字節做前端一年后,有啥收獲~

大家好&#xff0c;我是若川。今天分享這篇&#xff0c;相信讀完會有些收獲。本文經作者授權轉載&#xff0c;原文鏈接&#xff1a;https://juejin.cn/post/6980671091526074404個人簡介19年底12月進入字節實習&#xff0c; 第二年7月畢業轉正。到前幾天正好全職一周年。進入公…

app用戶隱私協議相關法律_隱私圖標和法律設計

app用戶隱私協議相關法律During its 2020 Worldwide Developers Conference, Apple spent time on one of today’s hottest topics — privacy. During the past couple of years, Apple has been rolling out various public campaigns aiming to position itself as a compa…

HTTP referer

簡言之&#xff0c;HTTP Referer是header的一部分&#xff0c;當瀏覽器向web服務器發送請求的時候&#xff0c;一般會帶上Referer&#xff0c;告訴服務器我是從哪個頁面鏈接過來的&#xff0c;服務器籍此可以獲得一些信息用于處理。比如從我主頁上鏈接到一個朋友那里&#xff0…

ecshop模板支持php,[老楊原創]關于ECSHOP模板架設的服務器php版本過高報錯的解決方法集合...

1、admin/index.phpadmin/sms_url.php報錯&#xff1a;Strict Standards: mktime(): You should be using the time() function instead in /data/web/ledetaoadmin/sms_url.php on line 31$auth mktime();替換為&#xff1a;$auth time();報錯&#xff1a;Strict Standards:…

35 點擊全圖后發現地圖“不見了”

相信很多用ArcGIS軟件作圖的時候會習慣用全圖按鈕&#xff0c;但是有的時候工程文件是他人提供的&#xff0c;也不太清楚是怎么做的&#xff0c;一點全圖&#xff0c;軟件界面就一片空白&#xff0c;找數據找半天&#xff0c;很是苦惱啊 這雖然不是什么大問題&#xff0c;但還是…

成為優秀溝通者的要素_如果您想成為更好的設計師,請成為更好的溝通者

成為優秀溝通者的要素Little changes that go a long way.小變化大有幫助。 I started my career in motion design.我的職業生涯始于運動設計。 My focus was on the visual and technical skills required to make emotionally compelling work. I believed great design s…

我讀源碼的經歷~

你好&#xff0c;我是若川。最近來了一些讀者朋友&#xff0c;在這里簡單介紹自己的經歷&#xff0c;也許對你有些啟發。可以點擊 ruochuan12 加我微信進群交流。這是我的公眾號卡片&#xff0c;可以加下星標。我是誰我是若川&#xff0c;畢業于江西高校&#xff0c;《面試官問…