完整的原文地址請點(diǎn)擊:地址
數(shù)組原型提供的方法主要分為三種,會改變自身值的,不會改變自身值的,遍歷方法。
- 改變自身值的方法(9個)
基于ES6,改變自身值的方法一共有9個,分別為
pop、push、reverse、shift、sort、splice、unshift,
以及兩個ES6新增的方法copyWithin和fill。- pop
pop() 方法刪除一個數(shù)組中的最后的一個元素,并且返回這個元素。如果是棧的話,這個過程就是棧頂彈出。
語法:arr.pop() - push
push()方法添加一個或者多個元素到數(shù)組末尾,并且返回數(shù)組新的長度。如果是棧的話,這個過程就是棧頂壓入。
語法:arr.push(element1, ..., elementN) - reverse
reverse()方法顛倒數(shù)組中元素的位置,第一個會成為最后一個,最后一個會成為第一個,該方法返回對數(shù)組的引用。
語法:arr.reverse() - shift
shift()方法刪除數(shù)組的第一個元素,并返回這個元素。
語法:arr.shift() - sort
sort()方法對數(shù)組元素進(jìn)行排序,并返回這個數(shù)組。
語法:arr.sort()
console.log(array === array.sort()) // true - splice
splice()方法用新元素替換舊元素的方式來修改數(shù)組。
splice是一個常用的方法,復(fù)雜的數(shù)組操作的場景通常都會有它的身影特別是需要維持原數(shù)組引用時,就地刪除或者新增元素,splice是最適合的。
語法:arr.splice(start,deleteCount[, item1[, item2[, …]]])start 指定從哪一位開始修改內(nèi)容。如果超過了數(shù)組長度,則從數(shù)組末尾開始添加內(nèi)容;如果是負(fù)值,則其指定的索引位置等同于 length+start (length為數(shù)組的長度),表示從數(shù)組末尾開始的第 -start 位。deleteCount 指定要刪除的元素個數(shù),若等于0,則不刪除。這種情況下,至少應(yīng)該添加一位新元素,若大于start之后的元素總和,則start及之后的元素都將被刪除。itemN 指定新增的元素,如果缺省,則該方法只刪除數(shù)組元素。返回值 由原數(shù)組中被刪除元素組成的數(shù)組,如果沒有刪除,則返回一個空數(shù)組。
- unshift
unshift() 方法用于在數(shù)組開始處插入一些元素(就像是棧底插入),并返回數(shù)組新的長度。
語法:arr.unshift(element1, ..., elementN) - copyWithin
copyWithin() 方法用于數(shù)組內(nèi)的元素替換,即替換元素和被替換元素均是數(shù)組內(nèi)的元素。
語法:arr.copyWithin(target, start[, end = this.length])
taget 指定被替換元素的索引,start 指定替換元素起始的索引,end 可選,指的是替換元素結(jié)束位置的索引。
如果start為負(fù),則其指定的索引位置等同于length+start,length為數(shù)組的長度。end也是如此。
注:目前只有Firefox(版本32及其以上版本)實現(xiàn)了該方法。var array = [1,2,3,4,5]; var array2 = array.copyWithin(0,3); console.log(array===array2,array2); // true [4, 5, 3, 4, 5] var array = [1,2,3,4,5]; console.log(array.copyWithin(0,3,4)); // [4, 2, 3, 4, 5] var array = [1,2,3,4,5]; console.log(array.copyWithin(0,-2,-1)); // [4, 2, 3, 4, 5] - fill
fill() 方法同樣用于數(shù)組元素替換,它可將數(shù)組指定區(qū)間內(nèi)的元素替換為某個值。
語法:arr.fill(value, start[, end = this.length])
value 指定被替換的值,start 指定替換元素起始的索引,end 可選,指的是替換元素結(jié)束位置的索引。
如果start為負(fù),則其指定的索引位置等同于length+start,length為數(shù)組的長度。end也是如此。var array = [1,2,3,4,5]; var array2 = array.fill(10,0,3); console.log(array===array2,array2); // true [10, 10, 10, 4, 5], 可見數(shù)組區(qū)間[0,3]的元素全部替換為10
- pop
- 不會改變自身的方法(9個)
基于ES7,不會改變自身的方法一共有9個,分別為
concat、join、slice、toString、toLocateString、 indexOf、lastIndexOf、未標(biāo)準(zhǔn)的toSource以及ES7新增的方法includes。-
concat
concat() 方法將傳入的數(shù)組或者元素與原數(shù)組合并,組成一個新的數(shù)組并返回。
語法:arr.concat(value1, value2, ..., valueN)var array = [1, 2, 3]; var array2 = array.concat(4,[5,6],[7,8,9]); console.log(array2); // [1, 2, 3, 4, 5, 6, 7, 8, 9] console.log(array); // [1, 2, 3], 可見原數(shù)組并未被修改 join
join() 方法將數(shù)組中的所有元素連接成一個字符串。
語法:arr.join([separator = ',']) separator可選,缺省默認(rèn)為逗號。slice
slice() 方法將數(shù)組中一部分元素淺復(fù)制存入新的數(shù)組對象,并且返回這個數(shù)組對象。
語法:arr.slice(start[, end])
參數(shù) start 指定復(fù)制開始位置的索引,end如果有值則表示復(fù)制結(jié)束位置的索引(不包括此位置)。
淺復(fù)制 是指當(dāng)對象的被復(fù)制時,只是復(fù)制了對象的引用,指向的依然是同一個對象。toString
toString() 方法返回數(shù)組的字符串形式,該字符串由數(shù)組中的每個元素的 toString() 返回值經(jīng)調(diào)用 join() 方法連接(由逗號隔開)組成。
語法: arr.toString()-
toLocaleString
toLocaleString() 類似toString()的變型,該字符串由數(shù)組中的每個元素的toLocaleString()返回值經(jīng)調(diào)用join()方法連接(由逗號隔開)組成。
語法:arr.toLocaleString()
數(shù)組中的元素將調(diào)用各自的 toLocaleString 方法: indexOf
indexOf() 方法用于查找元素在數(shù)組中第一次出現(xiàn)時的索引,如果沒有,則返回-1。
語法:arr.indexOf(element, fromIndex=0)
element 為需要查找的元素。
fromIndex 為開始查找的位置,缺省默認(rèn)為0。如果超出數(shù)組長度,則返回-1。
indexOf 使用嚴(yán)格相等(即使用 === 去匹配數(shù)組中的元素)。lastIndexOf
lastIndexOf() 方法用于查找元素在數(shù)組中最后一次出現(xiàn)時的索引,如果沒有,則返回-1。并且它是indexOf的逆向查找,即從數(shù)組最后一個往前查找。
語法:arr.lastIndexOf(element, fromIndex=length-1)
element 為需要查找的元素。
fromIndex 為開始查找的位置,缺省默認(rèn)為數(shù)組長度length-1。如果超出數(shù)組長度,由于是逆向查找,則查找整個數(shù)組。
同 indexOf 一樣,lastIndexOf 也是嚴(yán)格匹配數(shù)組元素。-
includes
includes() 方法基于ECMAScript 2016(ES7)規(guī)范,它用來判斷當(dāng)前數(shù)組是否包含某個指定的值,如果是,則返回 true,否則返回 false。
語法:arr.includes(element, fromIndex=0)
element 為需要查找的元素。
fromIndex 表示從該索引位置開始查找 element,缺省為0,它是正向查找,即從索引處往數(shù)組末尾查找。var array = [1, 2, NaN]; console.log(array.includes(1)); // true console.log(array.includes(NaN)); // true console.log(array.includes(2,-4)); // true toSource
toSource() 方法是非標(biāo)準(zhǔn)的,該方法返回數(shù)組的源代碼,目前只有 Firefox 實現(xiàn)了它。
語法:arr.toSource()
-
- 遍歷方法(12個)
基于ES6,遍歷方法一共有12個,分別為
forEach、every、some、filter、 map、reduce、reduceRight,
以及ES6新增的方法entries、find、findIndex、keys、values。-
forEach
forEach() 方法指定數(shù)組的每項元素都執(zhí)行一次傳入的函數(shù),返回值為undefined。
語法:arr.forEach(fn, thisArg)
fn 表示在數(shù)組每一項上執(zhí)行的函數(shù),接受三個參數(shù):
- value 當(dāng)前正在被處理的元素的值
- index 當(dāng)前元素的數(shù)組索引
- array 數(shù)組本身
thisArg 可選,用來當(dāng)做 fn 函數(shù)內(nèi)的 this 對象。
forEach 將為數(shù)組中每一項執(zhí)行一次 fn 函數(shù),那些 已刪除,新增或者從未賦值的項將被跳過(但不包括值為 undefined 的項)。
遍歷過程中,fn會被傳入上述三個參數(shù)。
var array = [1, 3, 5]; var obj = {name:'cc'}; var sReturn = array.forEach(function(value, index, array){ array[index] = value * value; console.log(this.name); // cc被打印了三次 },obj); console.log(array); // [1, 9, 25], 可見原數(shù)組改變了 console.log(sReturn); // undefined, 可見返回值為undefined -
every
every() 方法使用傳入的函數(shù)測試所有元素,只要其中有一個函數(shù)返回值為 false,那么該方法的結(jié)果為 false;如果全部返回 true,那么該方法的結(jié)果才為 true。var array = [18, 9, 10, 35, 80]; var array2 = array.every(function(value, index, array){ return value > 20; }); console.log(array2); //false some
some() 方法剛好同 every() 方法相反,some 測試數(shù)組元素時,只要有一個函數(shù)返回值為 true,則該方法返回 true,若全部返回 false,則該方法返回 false。-
filter
filter() 方法使用傳入的函數(shù)測試所有元素,并返回所有通過測試的元素組成的新數(shù)組。它就好比一個過濾器,篩掉不符合條件的元素。
語法:arr.filter(fn, thisArg)var array = [18, 9, 10, 35, 80]; var array2 = array.filter(function(value, index, array){ return value > 20; }); console.log(array2); // [35, 80] -
map
map() 方法遍歷數(shù)組,使用傳入函數(shù)處理每個元素,并返回函數(shù)的返回值組成的新數(shù)組。
語法:arr.map(fn, thisArg)var str = '12345'; var output = Array.prototype.map.call(str, function(x) { return x; }).reverse().join(' '); console.log(output);//5 4 3 2 1 -
reduce
reduce() 方法接收一個方法作為累加器,數(shù)組中的每個值(從左至右) 開始合并,最終為一個值。
語法:arr.reduce(fn, initialValue)
fn 表示在數(shù)組每一項上執(zhí)行的函數(shù),接受四個參數(shù):- previousValue 上一次調(diào)用回調(diào)返回的值,或者是提供的初始值
- value 數(shù)組中當(dāng)前被處理元素的值
- index 當(dāng)前元素在數(shù)組中的索引
- array 數(shù)組自身
initialValue 指定第一次調(diào)用 fn 的第一個參數(shù)。var array = [1, 2, 3, 4]; var s = array.reduce((p, v) => p * v,3); console.log(s); //72 reduceRight
reduceRight() 方法接收一個方法作為累加器,數(shù)組中的每個值(從右至左)開始合并,最終為一個值。除了與reduce執(zhí)行方向相反外,其他完全與其一致,請參考上述 reduce 方法介紹。-
entries
entries() 方法基于ECMAScript 2015(ES6)規(guī)范,返回一個數(shù)組迭代器對象,該對象包含數(shù)組中每個索引的鍵值對。
語法:arr.entries()var array = ["a", "b", "c"]; var iterator = array.entries(); console.log(iterator.next().value); // [0, "a"] console.log(iterator.next().value); // [1, "b"] console.log(iterator.next().value); // [2, "c"] console.log(iterator.next().value); // undefined, 迭代器處于數(shù)組末尾時, 再迭代就會返回undefined -
find&findIndex
find() 方法基于ECMAScript 2015(ES6)規(guī)范,返回數(shù)組中第一個滿足條件的元素(如果有的話), 如果沒有,則返回undefined。
findIndex() 方法則返回數(shù)組中第一個滿足條件的元素的索引(如果有的話)否則返回-1。
語法:arr.find(fn, thisArg),arr.findIndex(fn, thisArg)var array = [1, 3, 5, 7, 8, 9, 10]; function f(value, index, array){ return value%2==0; // 返回偶數(shù) } function f2(value, index, array){ return value > 20; // 返回大于20的數(shù) } console.log(array.find(f)); // 8 console.log(array.find(f2)); // undefined console.log(array.findIndex(f)); // 4 console.log(array.findIndex(f2)); // -1 -
keys
keys() 方法基于ECMAScript 2015(ES6)規(guī)范,返回一個數(shù)組索引的迭代器。(瀏覽器實際實現(xiàn)可能會有調(diào)整)
語法:arr.keys()var array = ["abc", "xyz"]; var iterator = array.keys(); console.log(iterator.next()); // Object {value: 0, done: false} console.log(iterator.next()); // Object {value: 1, done: false} console.log(iterator.next()); // Object {value: undefined, done: true}索引迭代器會包含那些沒有對應(yīng)元素的索引,如下:
var array = ["abc", , "xyz"]; var sparseKeys = Object.keys(array); var denseKeys = [...array.keys()]; console.log(sparseKeys); // ["0", "2"] console.log(denseKeys); // [0, 1, 2]利用keys實現(xiàn),生成一個從0到指定數(shù)字的新數(shù)組
[...Array(10).keys()]; // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [...new Array(10).keys()]; // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] -
values
values() 方法基于ECMAScript 2015(ES6)規(guī)范,返回一個數(shù)組迭代器對象,該對象包含數(shù)組中每個索引的值。其用法基本與上述 entries 方法一致。
語法:arr.values()var array = ["abc", "xyz"]; var iterator = array.values();//Array Iterator {} console.log(iterator.next().value); // abc console.log(iterator.next().value); // xyz -
Symbol.iterator
該方法基于ECMAScript 2015(ES6)規(guī)范,同 values 方法功能相同。
語法:arr[Symbol.iterator] ()var array = ["abc", "xyz"]; var iterator = array[Symbol.iterator](); console.log(iterator.next().value); // abc console.log(iterator.next().value); // xyz
-
- ES6專門擴(kuò)展了數(shù)組構(gòu)造器Array ,新增2個方法:Array.of、Array.from
-
Array.of
Array.of用于將參數(shù)依次轉(zhuǎn)化為數(shù)組中的一項,然后返回這個新數(shù)組,而不管這個參數(shù)是數(shù)字還是其它。它基本上與Array構(gòu)造器功能一致,唯一的區(qū)別就在單個數(shù)字參數(shù)的處理上。如下:Array.of(8.0); // [8] Array(8.0); // [undefined × 8]參數(shù)為多個,或單個參數(shù)不是數(shù)字時,Array.of 與 Array構(gòu)造器等同。
Array.of(8.0, 5); // [8, 5] Array(8.0, 5); // [8, 5] Array.of('8'); // ["8"] Array('8'); // ["8"]若是需要使用數(shù)組包裹元素,推薦優(yōu)先使用Array.of方法。
-
Array.from
Array.from的設(shè)計初衷是快速便捷的基于其他對象創(chuàng)建新數(shù)組,準(zhǔn)確來說就是從一個類似數(shù)組的可迭代對象創(chuàng)建一個新的數(shù)組實例,說人話就是,只要一個對象有迭代器,Array.from就能把它變成一個數(shù)組(當(dāng)然,是返回新的數(shù)組,不改變原對象)。
語法:Array.from(arrayLike[, processingFn[, thisArg]])
從語法上看,Array.from擁有3個形參,第一個為類似數(shù)組的對象,必選。第二個為加工函數(shù),新生成的數(shù)組會經(jīng)過該函數(shù)的加工再返回。第三個為this作用域,表示加工函數(shù)執(zhí)行時this的值。后兩個參數(shù)都是可選的。
我們來看看用法。var obj = {0: 'a', 1: 'b', 2:'c', length: 3}; let array = Array.from(obj, (value) => value.repeat(3)); console.log(array) //["aaa", "bbb", "ccc"]利用Array.from實現(xiàn),生成一個從0到指定數(shù)字的新數(shù)組
Array.from({length: 10}, (v, i) => i); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] -
Array.isArray
Array.isArray([]); // true Array.isArray({0: 'a', length: 1}); // false通過Object.prototype.toString去判斷一個值的類型,也是各大主流庫的標(biāo)準(zhǔn)。
-