Javascript之Array對象

The JavaScript?Array?object is a global object that?is used in the?construction?of?arrays; which are high-level, list-like objects.

先看看Array的prototype的結構:

Array的prototype的結構

0.length屬性

length?是Array的實例屬性。返回或設置一個數組中的元素個數。該值是一個無符號 32-bit 整數,并且總是大于數組最高項的下標。

注意:length屬性是可以手動修改的,而且通過下標賦值時自動更新length的值;

手動修改length
length自動更新為大于數組最大項的下標

1.concat

concat()?方法用于合并兩個或多個數組。此方法不會更改現有數組,而是返回一個新數組。


將數組和/或值連接成新數組

2.constructor

3.copyWithin

Syntax:

arr.copyWithin(target)

arr.copyWithin(target,start)

arr.copyWithin(target,start,end)

Parameters:

target

Zero based index at which to copy the sequence to. If negative,?target?will be counted from the end.

If?target?is at or greater than?arr.length, nothing will be copied. If?target?is positioned after?start, the copied sequence will be trimmed to fit?arr.length.

start?Optional

Zero based index at which to start copying elements from. If negative,?start?will be counted from the end.

If?start?is omitted,?copyWithin?will copy from the start (defaults to 0).

end?Optional

Zero based index at which to end copying elements from.?copyWithin?copies up to but not including?end. If negative,?end?will be counted from the end.

If?end?is omitted,?copyWithin?will copy until the end (default to?arr.length).

Return value

The modified array.

詳述

The?copyWithin?works like C and C++'s?memmove, and is a high-performance method to shift the data of an?Array. This especially applies to the?TypedArray?method of the same name. The sequence is copied and pasted as one operation; pasted sequence will have the copied values even when the copy and paste region overlap.

The?copyWithin?function is intentionally?generic, it does not require that its this value be an?Array?object.

The?copyWithin?method is a mutable method. It does not alter the length of?this, but will change its content and create new properties if necessary.

總結:

#1.target參數是必須的,也就是說copyWithin方法至少需要一個參數,否則該方法無效

缺少必要的參數

#2.target參數可以為負數,此時從末尾開始計算


target為負數

#3.start參數默認是0,當為負數時從末尾開始計算

#4.end參數默認是數組的長度,當為負數時從末尾開始計算

end參數使用默認值

4.entries

entries()?方法返回一個新的Array Iterator對象,該對象包含數組中每個索引的鍵/值對。該方法返回一個新的?Array?迭代器對象。Array Iterator是對象,它的原型(__proto__:Array Iterator)上有一個next方法,可用用于遍歷迭代器取得原數組的[key,value]。

使用entries獲取迭代器來遍歷數組

5.every:

every()?方法測試數組的所有元素是否都通過了指定函數的測試。

語法:

arr.every(callback[, thisArgs])

參數

callback

用來測試每個元素的函數。

thisArg

執行?callback?時使用的this值。

說明

every?方法為數組中的每個元素執行一次callback?函數,直到它找到一個使callback?返回false(表示可轉換為布爾值 false 的值)的元素。如果發現了一個這樣的元素,every?方法將會立即返回false。否則,callback?為每一個元素返回?true,every就會返回true。callback?只會為那些已經被賦值的索引調用。不會為那些被刪除或從來沒被賦值的索引調用。

callback?被調用時傳入三個參數:元素值,元素的索引,原數組。

如果為?every?提供一個thisArg參數,則該參數為調用?callback?時的?this?值。如果省略該參數,則?callback?被調用時的?this?值,在非嚴格模式下為全局對象,在嚴格模式下傳入?undefined。

every?不會改變原數組。

every遍歷的元素范圍在第一次調用?callback?之前就已確定了。在調用?every?之后添加到數組中的元素不會被?callback?訪問到。如果數組中存在的元素被更改,則他們傳入?callback的值是?every?訪問到他們那一刻的值。那些被刪除的元素或從來未被賦值的元素將不會被訪問到。

every和數學中的"所有"類似,當所有的元素都符合條件才返回true。另外,空數組也是返回true。(空數組中所有元素都符合給定的條件,注:因為空數組沒有元素)。

測試數組中的值

6.fill:

fill方法用一個固定值填充一個數組中從起始索引到終止索引內的全部元素。

語法:

arr.fill(value[, start[, end]])

描述:

具體要填充的元素區間是 [start,?end) , 一個半開半閉區間.

fill?方法接受三個參數value,?start?以及?end.start?和?end?參數是可選的, 其默認值分別為0和?this?對象的length 屬性值.

如果start是個負數, 則開始索引會被自動計算成為length+start, 其中length是this?對象的?length 屬性值. 如果?end?是個負數, 則結束索引會被自動計算成為?length+end.

fill方法故意被設計成通用方法, 該方法不要求?this?是數組對象.

fill方法是個可變方法, 它會改變調用它的?this?對象本身, 然后返回它, 而并不是返回一個副本.

當一個對象被傳遞給 fill 方法的時候, 填充數組的是這個對象的引用.

使用fill填充數組

7.filter:

filter()?方法創建一個新數組, 其包含通過所提供函數實現的測試的所有元素。

語法:

var new_array = arr.filter(callback[, thisArg])

參數:

callback

用來測試數組的每個元素的函數。調用時使用參數?(element, index, array)。

返回true表示保留該元素(通過測試),false則不保留。

thisArg

可選。執行?callback?時的用于this的值。

使用filter過濾數組

8.find:

find()?方法返回數組中滿足提供的測試函數的第一個元素的值。否則返回?undefined

find方法的語法和filter類似。

find 方法對數組中的每一項元素執行一次callback?函數,直至有一個?callback 返回?true。當找到了這樣一個元素后,該方法會立即返回這個元素的值,否則返回?undefined。注意?callback?函數會為數組中的每個索引調用即從?0?到?length - 1,而不僅僅是那些被賦值的索引,這意味著對于稀疏數組來說,該方法的效率要低于那些只遍歷有值的索引的方法。

callback 函數帶有3個參數:當前元素的值、當前元素的索引,以及數組本身。

如果提供了 thisArg 參數,那么它將作為每次 callback 函數執行時的上下文對象,否則上下文對象為?undefined

find 方法不會改變數組。

在第一次調用?callback?函數時會確定元素的索引范圍,因此在?find?方法開始執行之后添加到數組的新元素將不會被 callback 函數訪問到。如果數組中一個尚未被callback函數訪問到的元素的值被callback函數所改變,那么當callback函數訪問到它時,它的值是將是根據它在數組中的索引所訪問到的當前值。被刪除的元素仍舊會被訪問到。

使用find方法查找數組中的元素

9.findIndex:

findIndex()方法返回數組中滿足提供的測試函數的第一個元素的索引。否則返回-1。

與find的方法用法相同。

使用findIndex查找數組中滿足條件的元素的下標

10.forEach:

forEach()?方法對數組的每個元素執行一次提供的函數。

forEach?方法按升序為數組中含有效值的每一項執行一次callback函數,那些已刪除(使用delete方法等情況)或者未初始化的項將被跳過(但不包括那些值為?undefined 的項)(例如在稀疏數組上)。

callback?函數會被依次傳入三個參數:

數組當前項的值

數組當前項的索引

數組對象本身

如果給forEach傳遞了thisArg參數,當調用時,它將被傳給callback?函數,作為它的this值。否則,將會傳入?undefined?作為它的this值。callback函數最終可觀察到this值,這取決于?函數觀察到this的常用規則

forEach遍歷的范圍在第一次調用callback前就會確定。調用forEach后添加到數組中的項不會被callback訪問到。如果已經存在的值被改變,則傳遞給callback?的值是forEach遍歷到他們那一刻的值。已刪除的項不會被遍歷到。如果已訪問的元素在迭代時被刪除了(例如使用?shift()) ,之后的元素將被跳過 - 參見下面的示例。

forEach()?為每個數組元素執行callback函數;不像map()?或者reduce()?,它總是返回?undefined值,并且不可鏈式調用。典型用例是在一個鏈的最后執行副作用。

注意:forEach() 沒有返回值,無法中止。

使用forEach函數實現對象復制

11.includes:

includes()?方法用來判斷一個數組是否包含一個指定的值,根據情況,如果包含則返回 true,否則返回false。

語法:

arr.includes(searchElement[, fromIndex])

fromIndex,?從該索引處開始查找?searchElement。如果為負值,則按升序從 array.length + fromIndex 的索引開始搜索。如果值不在有效范圍內,默認為 0。

12.indexOf:

indexOf()方法返回在數組中可以找到一個給定元素的第一個索引,如果不存在,則返回-1。

語法:

arr.indexOf(searchElement[, fromIndex=0])

開始查找的位置。如果該索引值大于或等于數組長度,意味著不會在數組里查找,返回-1。如果參數中提供的索引值是一個負值,則將其作為數組末尾的一個抵消,即-1表示從最后一個元素開始查找,-2表示從倒數第二個元素開始查找 ,以此類推。 注意:如果參數中提供的索引值是一個負值,并不改變其查找順序,查找順序仍然是從前向后查詢數組。如果抵消后的索引值仍小于0,則整個數組都將會被查詢。其默認值為0.join:??join()

13.join:

join()?方法將一個數組(或一個類數組對象)的所有元素連接成一個字符串并返回這個字符串。

語法:

str = arr.join(separator)

separator,指定一個字符串來分隔數組的每個元素。如果需要(separator),將分隔符轉換為字符串。如果省略(),數組元素用逗號分隔。默認為 ","。如果separator是空字符串(""),則所有元素之間都沒有任何字符。返回值:一個所有數組元素連接的字符串。如果?arr.length?為0,則返回空字符串。

說明:所有的數組元素被轉換成字符串,再用一個分隔符將這些字符串連接起來。如果元素是undefined 或者null, 則會轉化成空字符串。

14.keys:

keys()?方法返回一個新的Array迭代器,它包含數組中每個索引的鍵。

使用keys()函數獲取迭代器來遍歷數組
索引迭代器會包含那些沒有對應元素的索引

15.lastIndexOf:

lastIndexOf()?方法返回指定元素(也即有效的 JavaScript 值或變量)在數組中的最后一個的索引,如果不存在則返回 -1。從數組的后面向前查找,從?fromIndex?處開始。

語法:

arr.lastIndexOf(searchElement[, fromIndex = arr.length - 1])

從此位置開始逆向查找。默認為數組的長度減 1,即整個數組都被查找。如果該值大于或等于數組的長度,則整個數組會被查找。如果為負值,將其視為從數組末尾向前的偏移。即使該值為負,數組仍然會被從后向前查找。如果該值為負時,其絕對值大于數組長度,則方法返回 -1,即數組不會被查找。

使用?lastIndexOf?定位數組中的值

16.map:

map()?方法創建一個新數組,其結果是該數組中的每個元素都調用一個提供的函數后返回的結果。

map?方法會給原數組中的每個元素都按順序調用一次callback?函數。callback?每次執行后的返回值(包括?undefined)組合起來形成一個新數組。?callback函數只會在有值的索引上被調用;那些從來沒被賦過值或者使用?delete?刪除的索引則不會被調用。

callback?函數會被自動傳入三個參數:數組元素,元素索引,原數組本身。

如果thisArg參數有值,則每次callback函數被調用的時候,this?都會指向thisArg?參數上的這個對象。如果省略了thisArg?參數,或者賦值為 null?或?undefined,則 this 指向全局對象 。

map?不修改調用它的原數組本身(當然可以在?callback?執行時改變原數組)。

使用 map 方法處理數組時,數組元素的范圍是在 callback 方法第一次調用之前就已經確定了。在 map 方法執行的過程中:原數組中新增加的元素將不會被 callback 訪問到;若已經存在的元素被改變或刪除了,則它們的傳遞到 callback 的值是 map 方法遍歷到它們的那一時刻的值;而被刪除的元素將不會被訪問到。

使用 map 方法獲取每個字符所對應的 ASCII 碼組成的數組

17.pop:

pop()方法從數組中刪除最后一個元素,并返回該元素的。此方法更改數組的長度

pop方法有意具有通用性。該方法和?call()?或?apply()?一起使用時,可應用在類似數組的對象上。pop方法根據?length屬性來確定最后一個元素的位置。如果不包含length屬性或length屬性不能被轉成一個數值,會將length置為0,并返回undefined。

空數組上調用 pop(),返回 ?undefined

18.push:

push()?方法將一個或多個元素添加到數組的末尾,并返回新數組的長度。

語法:

arr.push(element1,...,elementN)

返回值:當調用該方法時,新的?length?屬性值將被作為返回值返回。

push方法有意具有通用性。該方法和?call()?或?apply()?一起使用時,可應用在類似數組的對象上。push方法根據length屬性來決定從哪里開始插入給定的值。如果length不能被轉成一個數值,則插入的元素索引為 0,包括length不存在時。當?length?不存在時,將會創建它。

唯一的原生類數組(array-like)對象是?Strings,盡管如此,它們并不適用該方法,因為字符串是不可改變的。

push()函數返回數組的長度

19.reduce:

reduce()?方法對累加器和數組中的每個元素(從左到右)應用一個函數,將其減少為單個值。

語法:

arr.reduce(callback[, initialValue])

callback

執行數組中每個值的函數,包含四個參數:

accumulator

累加器累加回調的返回值; 它是上一次調用回調時返回的累積值,或initialValue(如下所示)。

currentValue

數組中正在處理的元素。

currentIndex | 可選

數組中正在處理的當前元素的索引。 如果提供了initialValue,則索引號為0,否則為索引為1。

array | 可選

調用reduce的數組

initialValue | 可選

用作第一個調用callback的第一個參數的值。 如果沒有提供初始值,則將使用數組中的第一個元素。 在沒有初始值的空數組上調用 reduce 將報錯。

注意:如果沒有提供initialValue,reduce 會從索引1的地方開始執行 callback 方法,跳過第一個索引。如果提供initialValue,從索引0開始。

沒有提供initialValue,reduce函數調用2次callback
提供initialValue,reduce函數調用3次callback
提供initialValue=0,把reduce函數作為求和器

20.reduceRight:

reduceRight()?方法接受一個函數作為累加器(accumulator)和數組的每個值(從右到左)將其減少為單個值。

reduceRight?為數組中每個元素調用一次?callback?回調函數,但是數組中被刪除的索引或從未被賦值的索引會跳過。回調函數接受四個參數:初始值(或上次調用回調的返回值)、當前元素值、當前索引,以及調用?reduce?的數組。

首次調用回調函數時,previousValue?和?currentValue可以是兩個值之一。如果調用?reduceRight?時提供了initialValue參數,則previousValue等于initialValue,currentValue等于數組中的最后一個值。如果沒有提供initialValue參數,則previousValue?等于數組最后一個值,currentValue?等于數組中倒數第二個值。

如果數組為空,且沒有提供initialValue?參數,將會拋出一個TypeError 錯誤。如果數組只有一個元素且沒有提供initialValue?參數,或者提供了initialValue?參數,但是數組為空將會直接返回數組中的那一個元素或?initialValue?參數,而不會調用callback。

reduce和reduceRight的區別

21.reverse:

reverse()?方法將數組中元素的位置顛倒,并返回該數組的引用。

利用reverse函數反轉字符串

22.shift:

shift()?方法從數組中刪除第一個元素,并返回該元素的值。此方法更改數組的長度。如果數組為空則返回undefined?。

shift?方法移除索引為 0 的元素(即第一個元素),并返回被移除的元素,其他元素的索引值隨之減 1。如果?length?屬性的值為 0 (長度為 0),則返回?undefined

shift?方法并不局限于數組:這個方法能夠通過call?或?apply方法作用于類似數組的對象上。但是對于沒有 length 屬性(從0開始的一系列連續的數字屬性的最后一個)的對象,調用該方法可能沒有任何意義。

shift函數刪除數組中第一個元素

23.slice:

slice()?方法返回一個從開始到結束(不包括結束)選擇的數組的一部分淺拷貝到一個新數組對象。且原始數組不會被修改。

語法:

arr.slice([begin[, end]])

begin | 可選

從該索引處開始提取原數組中的元素(從0開始)。

如果該參數為負數,則表示從原數組中的倒數第幾個元素開始提取,slice(-2)表示提取原數組中的倒數第二個元素到最后一個元素(包含最后一個元素)。

如果省略?begin,則?slice?從索引 0 開始。

end | 可選

在該索引處結束提取原數組元素(從0開始)。slice會提取原數組中索引從begin到end?的所有元素(包含begin,但不包含end)。

slice(1,4)?提取原數組中的第二個元素開始直到第四個元素的所有元素 (索引為 1, 2, 3的元素)。

如果該參數為負數,則它表示在原數組中的倒數第幾個元素結束抽取。?slice(-2,-1)表示抽取了原數組中的倒數第二個元素到最后一個元素(不包含最后一個元素,也就是只有倒數第二個元素)。

如果end被省略,則slice會一直提取到原數組末尾。

如果?end 大于數組長度,slice 也會一直提取到原數組末尾。

用slice函數選擇數組元素

24.some:

some()?方法測試數組中的某些元素是否通過由提供的函數實現的測試。

some?為數組中的每一個元素執行一次callback?函數,直到找到一個使得 callback 返回一個“真值”(即可轉換為布爾值 true 的值)。如果找到了這樣一個值,some將會立即返回true。否則,some?返回?false。callback只會在那些”有值“的索引上被調用,不會在那些被刪除或從來未被賦值的索引上調用。

callback?被調用時傳入三個參數:元素的值,元素的索引,被遍歷的數組。

如果為?some?提供了一個thisArg參數,將會把它傳給被調用的callback,作為this值。否則,在非嚴格模式下將會是全局對象,嚴格模式下是?undefined。

some被調用時不會改變數組。

some遍歷的元素的范圍在第一次調用callback. 時就已經確定了。在調用?some?后被添加到數組中的值不會被?callback?訪問到。如果數組中存在且還未被訪問到的元素被?callback?改變了,則其傳遞給?callback?的值是?some?訪問到它那一刻的值。

25.sort:

sort()?方法用就地( in-place )的算法對數組的元素進行排序,并返回數組。 sort 排序不一定是穩定的。默認排序順序是根據字符串Unicode碼點。

語法:

arr.sort(compareFunction)

sort()函數默認按照Unicode排序
情況復雜時,sort使用默認排序不能得到想要的結果
使用映射優化排序
自定義排序函數

26.splice:

splice()?方法通過刪除現有元素和/或添加新元素來更改一個數組的內容。

語法:

array.splice(start[, deleteCount[, item1[, item2[, ...]]]])

splice方法使用deleteCount參數來控制是刪除還是添加:

start參數是必須的,表示開始的位置(從0計數),如:start=0從第一個開始;start>= array.length-1表示從最后一個開始。

①、從start位置開始刪除[start,end]的元素。

array.splice(start)

②、從start位置開始刪除[start,Count]的元素。

array.splice(start, deleteCount)?? ?

③、從start位置開始添加item1, item2, ...元素。

array.splice(start,?0, item1, item2, ...) ??

刪除一個元素并插入一個元素 ? ?
插入一個元素
清空數組

27.toLocaleString:

toLocaleString()?返回一個字符串表示數組中的元素。數組中的元素將使用各自的toLocaleString?方法轉成字符串,這些字符串將使用一個特定語言環境的字符串(例如一個逗號 ",")隔開。

toLocaleString()函數可以將數組以字符串形式表達,并可以傳入兩個參數

28.toString:

toString()?返回一個字符串,表示指定的數組及其元素。Array?對象覆蓋了Object?的?toString?方法。對于數組對象,toString?方法返回一個字符串,該字符串由數組中的每個元素的?toString()?返回值經調用join()?方法連接(由逗號隔開)組成。

返回數組的字符串表達

29.unshift:

unshift()?方法將一個或多個元素添加到數組的開頭,并返回新數組的長度。unshift?方法會在調用它的類數組(array-like)對象的開始位置插入給定的參數。

unshift?特意被設計成具有通用性;這個方法能夠通過call?或?apply方法作用于類似數組的對象上。不過對于沒有 length 屬性(代表從0開始的一系列連續的數字屬性的最后一個)的對象,調用該方法可能沒有任何意義。

當一個對象調用該方法時,返回其?length?屬性值。

在數組的頭部插入值

30.values:

values()?方法返回一個新的Array Iterator?對象,該對象包含數組每個索引的值。

注意:Chrome 未實現,Firefox未實現,Edge已實現。

Chrome 及Firefox可以用"arr[Symbol.iterator]()"方法來代替values()方法:

Array.prototype[@@iterator]()屬性和 values() 屬性的初始值均為同一個函數對象。

node環境未實現values函數

31.Symbol(Symbol.iterator):??values()

@@iterator?屬性和?values()?屬性的初始值均為同一個函數對象。

使用iterator迭代數組
另一種迭代方式
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執行單位為行(line),也就是一...
    悟名先生閱讀 4,193評論 0 13
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,877評論 0 38
  • 第3章 基本概念 3.1 語法 3.2 關鍵字和保留字 3.3 變量 3.4 數據類型 5種簡單數據類型:Unde...
    RickCole閱讀 5,149評論 0 21
  • 創建數組 arr.length--- title: js正則表達式categories: javascriptda...
    angelwgh閱讀 1,403評論 0 2
  • 在遇到事情時,第一個想到的是你 在看到喜歡的視頻和圖片是,第一個想到是你 就是想把一切都和你分享 但是 我在通訊錄...
    冰大頭閱讀 307評論 0 0