Array 原型方法
Array.prototype.at()
方法接收一个整数值并返回该索引对应的元素,允许正数和负数。负整数从数组中的最后一个元素开始倒数
语法
1 | ary.at(index) |
参数
index
:要返回的数组元素的索引。传递负数时,返回的元素将从数组的末端开始倒数
返回值
参数索引对应的值。如果找不到指定的索引,则返回 undefined
描述
在传递非负数时,at()
方法等价于中括号表示法,例如ary[0]
和ary.at(0)
均返回第一个元素;当索引小于0时,该方法将访问索引index + ary.length
at()
方法是通用的,仅需要this
具有length
属性和以整数为键的属性
示例
获取数组中倒数第二个元素的不同方法。虽然示例中所有的方法都是可行的,但是at()
方法更加简洁和可读
1 | const colors = ['red', 'green', 'blue'] |
在类数组对象上调用at()
1 | const aryLike = { |
Array.prototype.concat()
用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新的数组
语法
1 | ary.concat(value0, value1, ..., valueN) |
参数
valueN
:数组或者值,将被合并到一个新的数组中。如果不传参数,则concat
会返回调用此方法的现存数组的一个浅拷贝
返回值
新的 Array 实例
描述
concat
方法创建一个新的数组,它由被调用的对象中的元素组成,每个参数的顺序依次是该参数的元素(如果参数是数组)或参数本身(参数不是数组)。它不会递归到嵌套数组参数中
concat
方法不会改变 this 或任何作为参数提供的数组,而是返回一个浅拷贝
示例
合并两个数组
1 | const ary1 = ['a', 'b', 'c'] |
合并三个数组
1 | const num1 = [1, 2, 3] |
将值连接到数组
1 | const ary1 = ['a', 'b', 'c'] |
合并到嵌套数组
1 | const num1 = [[1]] |
合并类数组对象
当Symbol.isConcatSpreadable
被设置为真值(例如:true)时,concat 会将类数组对象视为数组
1 | const obj1 = { 0: 1, 1: 2, 2: 3, length: 3 } |
Array.prototype.copyWithin()
方法浅复制数组的一部分到同一数组中的另一个位置,并返回它,不会改变原数组的长度
语法
1 | copyWithin(target) |
参数
三个参数都为数组的索引
target
:
复制序列到该位置。如果是负数,target
将从末尾开始计算。如果target
大于等于数组长度,将不会发生拷贝。如果target
在start
之后,复制的序列将被修改以符合数组长度
start
:
开始复制元素的起始位置。如果是负数,start
将从末尾开始计算。如果start
被忽略,方法将会从 0 开始复制
end
:
复制元素的结束位置(不包括这个位置的元素)。如果是负数,end
将从末尾开始计算。如果被忽略,将一直复制到数组结尾
返回值
改变后的数组。会改变原数据,但不会改变原数组的长度
描述
三个参数都必须为整数
copyWithin
方法不要求其 this 值必须是一个数组对象;除此之外,copyWithin
是一个可变方法,它可以改变 this 对象本身,并返回它,而不仅仅是它的拷贝
copyWithin
会保留空槽
copyWithin
是一个可变方法,它不会改变 this 的长度 length,但是会改变 this 本身的内容,且需要时会创建新的属性
例子
1 | const ary = [1, 2, 3, 4, 5] |
Array.prototype.entries()
返回一个新的数组迭代器对象,该对象包含数组中每个索引的键/值对
语法
1 | entries() |
返回值
一个新的 Array
迭代器对象
描述
当在稀疏数组上使用时,entries()
方法迭代空槽,就像他们的值为undefined
一样
entries()
方法是通用的。它只要求this
值具有length
属性和以证书为键的属性
示例
1 | // 迭代索引和元素 |
Array.prototype.every()
every() 方法测试一个数组内的所有元素是否都能通过某个指定函数的测试,它返回一个布尔值。若是一个空数组,此方法在任何情况下都会返回 true
语法
1 | every(element => { } ) |
参数
callback
用来测试每个元素的函数,它可以接收三个参数:element
用于测试的当前值index
用于测试的当前值的索引array
调用every
的当前数组
thisAry
(可选) 执行callback
时使用的this
值
返回值
如果回调函数的每一次返回都为 truthy 值,返回 true
,否则返回 false
描述
every
方法为数组中的每一个元素执行一次 callback
函数,如果 callback
返回 falsy 值,every
方法会立即返回 false
。否则,callback
为每一个元素返回 true
,every
就会返回 true
。callback
只会为那些已经被赋值的索引调用,不会为那些被删除或从未被赋值的索引调用
1 | const ary = [0, 1, , undefined, null, 5, 6] |
every
不会改变原数组
every
遍历的元素范围在第一次调用 callback
之前就已经确定了。在调用 every
之后添加到数组中的元素不会被 callback
访问到。如果数组中存在的元素被更改,则它们传入 callback
的值是 every
访问到它们那一刻的值
Array.prototype.fill()
fill()
方法用一个固定值填充一个数组中从起始索引到终止索引内的全部元素。不包括终止索引
语法
1 | fill(value) |
参数
value
用来填充数组元素的值start
可选。起始索引,默认值为 0end
可选。终止索引,默认值为arr.length
返回值
修改后的数组
描述
如果 start
是个负数,则开始索引会被自动计算成为 length + start
,其中 length
是 this
对象的 length
属性。如果 end
是负数,则结束索引会被自动计算成为 length + end
fill
方法故意被设计成通用方法,该方法不要求 this
是数组
fill
方法是个可变方法,他会改变调用它的 this
对象本身,然后返回它,而不是返回一个副本
当一个对象被传递给 fill
方法的时候,填充数组的是这个对象的引用
示例
1 | [1, 2, 3].fill(4) // [4, 4, 4] |
Array.prototype.filter()
filter()
方法创建给定数组一部分的浅拷贝,其包含通过所提供函数实现的测试的所有元素
语法
1 | // 箭头函数 |
参数
callbackFn
用来测试数组中每个元素的函数。返回true
表示该元素通过测试,保留该元素,false
则不保留。它接受以下三个参数:element
数组中当前正在处理的元素index
正在处理的元素在数组中的索引array
调用filter()
的数组本身
thisArg
可选。执行callbackFn
时,用于this
的值
返回值
一个新的、由通过测试的元素组成的数组,如果没有任何数组元素通过测试,则返回空数组
描述
filter()
为数组中的每个元素调用一次 callbackFn
函数,并利用所有使 callbackFn
返回 true 或等价于 true 的值的元素创建一个新数组
callbackFn
只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用。那些没有通过 callbackFn
测试的元素会被跳过,不会被包含在新数组中
如果 filter()
提供一个 thisArg
参数,则它会被作为 callbackFn
被调用时的 this
值。否则,callbackFn
的 this
值在非严格模式下将是全局对象,严格模式下为 undefined
。callbackFn
函数最终观察到的 this
值是根据通常函数所看到的 this
的规则确定的
filter()
不会改变原数组
filter()
遍历的元素范围在第一次调用 callbackFn
之前就已经确定了。修改已经访问过的或在确定的范围之外创建的元素,将不会被 callbackFn
访问。如果以相同的方式删除数组中的现有元素,则不会访问他们
Array.prototype.find()
find()
方法返回数组中满足提供的测试函数的第一个元素的值。否则返回undefined
语法
1 | // 箭头函数 |
参数
callbackFn
在数组每一项上执行的函数,接受 3 个参数:element
当前遍历道的元素index
当前遍历到的索引array
数组本身
thisArg
可选 执行回调时用作this
的对象
返回值
数组中第一个满足所提供测试函数的元素的值,否则返回 undefined
描述
find
方法对数组中的每一项元素执行一次 callbackFn
函数,直到有一个 callbackFn 返回 true
。当找到了这样一个元素后,该方法会立即返回这个元素的值,否则返回 undefined
。
**callbackFn
函数会为数组中的每个索引调用,而不仅仅是那些被赋值的索引,这意味着对于稀疏数组来说,该方法的效率要低于那些只遍历有值的索引的方法
如果提供了 thisArg
函数,那么它将作为每次 callbackFn
函数执行时的 this
,如果未提供,则使用 undefined
在第一次调用 callbackFn
函数时会确定元素的索引范围,因此在 find
方法开始执行之后添加到数组的新元素将不会被 callbackFn
函数访问到。如果数组中一个尚未被 callbackFn
函数访问到的元素的值被 callbackFn
函数所改变,那么当 callbackFn
函数访问到它时,它的值时根据它在数组中的索引所访问到的当时值。被删除的元素仍旧会被访问到,但是其值已经是 undefined 了
Array.prototype.findIndex()
findIndex()
方法返回数组中满足提供的测试函数的第一个元素的索引。若没有找到对应元素则返回 -1
语法
1 | // 箭头函数 |
参数
callback
针对数组中的每个元素,都会执行该回调函数,执行时会自动传入下面三个参数:element
当前元素index
当前元素的索引array
调用findIndex
的数组
thisArg
可选。执行callback
时作为this
对象的值
返回值
数组中通过提供测试函数的第一个元素的索引。否则,返回 -1
描述
findIndex
方法对数组中的每个数组索引 0...length-1
(包括)执行一次 callback
函数,直到找到一个 callback
函数返回真实值(强制为 true)的值。如果找到这样的元素,findIndex
会立即返回该元素的索引,如果回调从不返回真值,或者数组的 length
为 0,则 findIndex
返回 -1。在稀疏数组中,即使对于数组中不存在的条目的索引页会调用回调函数
findIndex
不会修改所调用的数组
在第一次调用 callback
函数时会确定元素的索引范围,因此在 findIndex
方法开始执行之后添加到数组的新元素将不会被 callback
函数访问到。如果数组中一个尚未被 callback
函数访问到的元素的值被 callback
函数所改变,那么当 callback
函数访问到它时,它的值将是根据它在数组中的索引所访问到的当前值。被删除的元素仍然会被访问到
Array.prototype.findLast()
findLast()
方法返回数组中满足提供的测试函数条件的最后一个元素的值。如果没有找到对应元素,则返回undefined
语法
1 | // 箭头函数 |
参数
callbackFn
数组中测试元素的函数。函数在被调用时会传递以下参数element
当前遍历到的元素index
当前遍历到的元素的索引array
调用findLast()
的数组本身
thisArg
执行callbackFn
时,用作this
的对象
返回值
数组中满足提供的测试函数索引最高的元素;如果没有元素匹配,返回 undefined
描述
findLast()
方法对数组每一个元素按降序(索引从大到小)执行 callbackFn
函数,直到 callbackFn
返回一个真值。然后 callbackFn
返回该元素的值并停止遍历数组。如果 callbackFn
没有返回一个真值,则 findLast()
返回 undefined
callbackFn
会为数组中的每个元素调用,而不仅仅是那些被赋值的元素,这意味着对于稀疏数组来说,该方法的效率要低于那些只遍历有值的索引的方法
findLast()
方法不会改变调用它的数组,但是提供的 callbackFn
可以
findLast()
处理的元素是在第一次调用 callbackFn
之前设置的,因此:
callbackFn
不会访问在调用findLast()
开始后才添加到数组中的任何元素- 给已访问过的索引重新赋值将不会被
callbackFn
重新访问 - 给初始的范围外的索引赋值,其将不会被
callbackFn
访问 - 如果
callbackFn
更改了数组中现有的、尚未访问的元素,则其传递给callbackFn
的值将是findLast()
访问该元素索引时的值 - 仍然会访问已删除的元素
示例
1 | // 查找符合条件的数组中的最后一项 |
Array.prototype.findLastIndex()
findLastIndex()
方法返回数组中满足提供的测试函数条件的最后一个元素的索引。若没有找到对应元素,则返回 -1
语法
1 | // 箭头函数 |
参数
callbackFn
数组中测试元素的函数。函数在被调用时会传递以下参数:element
当前遍历到的元素index
当前遍历到的元素的索引array
调用findLastIndex()
的数组本身
thisArg
可选。执行callbackFn
时,用作this
的对象
返回值
数组中通过测试的最后一个元素(最大的索引)。如果没有任何元素匹配,则返回 -1
描述
findLastIndex()
方法对数组每一个元素降序(索引从大到小)执行 callbackFn
函数,直到 callbackFn
返回一个真值。然后 findLastIndex()
返回元素的索引并且停止迭代数组。如果 callbackFn
没有返回一个真值,则 findLastIndex()
返回 -1
callbackFn
会为数组中的每个元素调用,而不仅仅是那些被赋值的元素,这意味着对于稀疏数组来说,该方法的效率要低于那些只遍历有值的索引的方法
findLastIndex()
方法不会改变调用它的数组,但是提供的 callbackFn
可以。findLastIndex()
处理的元素是在第一次调用 callbackFn
之前设置的,因此:
callbackFn
不会访问在调用findLastIndex
开始后才添加到数组中的任何元素- 给已访问过的索引重新赋值将不会被
callbackFn
重新访问 - 给初始的范围外的索引赋值,其将不会被
callbackFn
访问 - 如果
callbackFn
更改了数组中现有的、尚未访问的元素,则其传递给callbackFn
的值将是findLastIndex()
访问该元素索引时的值 - 仍然会访问已删除的元素
Array.prototype.flat()
flat()
方法会按一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回
语法
1 | flat() |
参数
depth
可选。指定要提取嵌套数组的解构深度,默认值为 1
返回值
一个包含数组与子数组中所有元素的新数组。不会改变原数组
示例
1 | // 扁平化嵌套数组 |
Array.prototype.flatMap()
flatMap()
方法首先使用映射函数映射每个元素,然后将结果压缩成一个新数组。它与 map 连着深度值为 1 的 flat 几乎相同,但flatMap
通常在合并成一种方法的效率稍微高一些
语法
1 | // 箭头函数 |
参数
callback
可以生成一个新数组中的元素的函数,可以传入三个参数:currentValue
当前正在数组中处理的元素index
可选。数组中正在处理的当前元素的索引array
可选。被调用的map
数组
thisArg
可选。执行callback
函数时使用的this
值
返回值
一个新的数组,其中每一个元素都是回调函数的结果,并且结构深度depth
值为1。不会改变原数组
示例
1 | // map() 与 flatMap() |
flatMap
能用于在 map 期间增删项目。它的作用类似于 filter 的对立面。只需返回一个1项元素数组以保留该项,返回一个多元素数组以添加项,或返回一个0项元素数组以删除该项
1 | // 移除所有负数并将奇数拆分成偶数和1 |
Array.prototype.forEach()
forEach
方法对数组的每个元素执行一次给定的函数
语法
1 | // 箭头函数 |
参数
callbackFn
为数组中每个元素执行的函数。函数调用时带有以下参数element
数组中正在处理的当前元素index
数组中正在处理的当前元素的索引array
forEach()
方法正在操作的数组
thisArg
可选参数。当执行回调函数callbackFn
时,用作this
的值
返回值
undefined
描述
forEach()
方法按升序为数组中含有效值的每一项执行一次callbackFn
函数,那些已删除或者未初始化的项将被跳过(例如在稀疏数组上)
1 | const arraySparse = [1, 3, /* empty */, 7]; |
如果thisArg
参数有值,则每次callbackFn
函数被调用时,this
都会指向thisArg
参数。如果省略了thisArg
参数,或者其值为null
或undefined
,this
指向全局对象。如果使用箭头函数表达式来传入函数参数,thisArg 参数会被忽略,因为箭头函数在词法上绑定了 this 值
forEach()
遍历的范围在第一次调用callbackFn
前就会确定。调用forEach
后添加到数组中的项不会被callbackFn
访问到。如果已经存在的值被改变,则传递给callbackFn
的值是forEach()
遍历到他们的那一刻的值。已删除的项不会被遍历到。如果已访问的元素在迭代时被删除了,之后的元素将跳过(因为元素被删除后后面的元素的索引往前移了一位)
1 | const words = ['one', 'two', 'three', 'four']; |
forEach()
与map()
和reduce()
不同的是,它总是返回 undefined 值,并且不可链式调用
forEach()
被调用时,不会直接改变原数据,但是该数据可能会被callbackFn
函数改变
除了抛出异常外,没有办法终止或跳出forEach()
循环。如果需要提前终止循环,可以使用:
- for 循环
- for…of / for…in 循环
- Array.prototype.every()
- Array.prototype.some()
- Array.prototype.find()
- Array.prototype.findIndex()
forEach()
方法要求使用同步函数—它不会等待promise执行完成
1 | const ratings = [5, 4, 5]; |
Array.from()
Array.from()
方法对一个类似数组或可迭代对象创建一个新的、浅拷贝的数组实例
语法
1 | Array.from(arrayLike, (element) => {}) |
参数
arrayLike
想要转换成数组的伪数组对象或可迭代对象mapFn
可选。如果指定了该参数,新数组中的每个元素会执行该回调函数thisArg
可选。执行回调函数mapFn
时的this
对象
返回值
一个新的数组实例
描述
Array.from()
可以通过以下方式来创建数组对象:
- 伪数组对象(拥有一个
length
属性和若干索引属性的任意对象) - 可迭代对象(可以获取对象中的元素,如 Map 和 Set 等)
Array.from()
方法有一个可选参数mapFn
,可以让开发者在最后生成的数组上再执行一次map
方法后再返回。也就是说Array.from(obj, mapFn, thisAry)
就相当于Array.from(obj).map(mapFn, thisAry)
,除非创建的不是可用的中间数组
from()
的length
属性为1,即Array.from.length === 1
在 ES6 中,Class
语法允许我们为内置类型(比如Array
)和自定义类新建子类(比如叫subArray
)。这些子类也会继承父类的静态方法,比如subArray.from()
,调用该方法后会返回子类subArray
的一个实例,而不是Array
的实例
示例
从String
生成数组
1 | Array.from('foo') |
从Set
生成数组
1 | const set = new Set(['foo', 'bar', 'baz', 'foo']); |
从Map
生成数组
1 | const map = new Map([[1, 2], [2, 4], [4, 8]]); |
从类数组对象(arguments)生成数组
1 | function f() { |
如果参数是一个普通对象
1 | const obj = { a: 1, b: 2, c: 3} |
使用箭头函数
1 | Array.from([1, 2, 3], x => x + x); |
Array.prototype.includes()
includes()
方法用来判断一个数组是否包含一个指定的值,如果包含则返回true
,否则返回false
语法
1 | includes(searchElement) |
参数
searchElement
需要查找的元素值(比较字符串时是区分大小写的)fromIndex
从fromIndex
索引处开始查找searchElement
。如果为负值,则按升序从array.length + fromIndex
的索引开始搜,默认为 0
返回值
返回一个布尔值,如果在数组中(或fromIndex
指定的范围中)找到了searchElement
,则返回true
,否则返回false
0 的值将全部视为相等,与符号无关(即 -0 与 0 和 +0 相等),但false
不被认为与 0 相等
示例
1 | [1, 2, 3].includes(2) // true |
如果fromIndex
大于等于数组长度,则将直接返回false
,且不搜索该数组
1 | const arr = ['a', 'b', 'c']; |
如果fromIndex
为负值,计算出的索引将作为开始搜索searchElement
的位置。如果计算出的索引小于 0,则整个数组都会被搜索
1 | const arr = ['a', 'b', 'c']; |
inclides()
方法有意设计为通用方法。它不要求this
值是数组对象,所以它可以被用于其他类型的对象(比如类数组对象)
1 | (function() { |
Array.prototype.indexOf()
indexOf()
方法返回在数组中可以找到给定元素的第一个索引,如果不存在,则返回 -1
语法
1 | indexOf(searchElement) |
参数
searchElement
要查找的元素fromIndex
可选。开始查找的位置
返回值
首个被找到的元素在数组中的索引位置,若没有找到则返回 -1
描述
indexOf
使用全等运算(===)判断searchElement
与数组中包含的元素之间的关系
示例
1 | const ary = [2, 8, 9] |
Array.isArray()
Array.isArray()
用于确定传递的值是否是一个Array
语法
1 | Array.isArray(value) |
参数
value
需要检测的值
返回值
如果值是 Array
,则为true
,否则为false
示例
1 | // 鲜为人知的事实,Array.prototype 也是一个数组 |
当检测Array
实例时,Array.isArray
优于instanceof
,因为Array.isArray
能检测iframe
1 | const iframe = document.createElement('iframe'); |
Array.prototype.join()
join()
方法将一个数据(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串,用逗号或指定的分隔符字符串分隔。如果数组只有一个元素,那么将返回该元素而不使用分隔符
语法
1 | join() |
参数
separator
可选。指定一个字符串来分隔数组的每个元素。如果需要,将分隔符转换为字符串。如果省略,数组元素用逗号分隔。如果分隔符是空字符串,则所有元素之间都没有任何字符
返回值
一个所有数组元素连接的字符串。如果arr.length
为 0,则返回空字符串
描述
所有数组元素被转换成字符串并连接到一个字符串中。如果一个元素是undefined
或null
,它将被转换为空字符串,而不是字符串undefined
或null
Array.prototype.toString()
会在内部访问join
方法,不带参数。覆盖数组实例的join
也将覆盖它的toString
行为
当在稀疏数组上使用时,join()
方法迭代空槽,就像他们的值为undefined
一样
示例
使用不同的方式连接数据
1 | const a = ['Wind', 'Water', 'Fire']; |
在稀疏数组上使用join()
1 | // join() 将空槽视为 undefined,并产生额外的分隔符 |
在非数组对象上调用join()
1 | const arrayLike = { |
Array.prototype.keys()
keys()
方法返回一个包含数组中每个索引键的Array Iterator
对象
语法
1 | keys() |
返回值
一个新的Array
迭代器对象
示例
索引迭代器会包含那些没有对应元素的索引
1 | const arr = ["a", , "c"]; |
Array.prototype.lastIndexOf()
lastIndexOf()
方法返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1。从数组的后面向前查找,从fromIndex
处开始
语法
1 | lastIndexOf(searchElement) |
参数
searchElement
被查找的元素fromIndex
可选。从此位置开始逆向查找。默认为数组的长度减1(arr.length - 1),即整个数组都被查找。如果该值大于或等于数组的长度,则整个数组会被查找。如果为负值,将其视为从数组末尾向前的便宜。即使该值为负,数组仍然会被从后向前查找。如果该值为负时,其绝对值大于数组长度,则方法返回 -1,即数组不会被查找
返回值
数组中该元素最后一次出现的索引,如未找到返回 -1
描述
lastIndexOf
使用严格相等(===)比较searchElement
和数组中的元素
示例
1 | var array = [2, 5, 9, 2]; |
Array.prototype.map()
map()
方法创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成
语法
1 | map(callbackFn) |
参数
callbackFn
为数组中的每个元素执行的函数。它的返回值作为一个元素被添加到新数组中。该函数被调用时将传入以下参数:
element
数组中当前正在处理的元素index
正在处理的元素在数组中的索引array
调用了map()
的数组本身
thisArg
可选。执行callbackFn
时用作this
的值
返回值
一个新数组,每个元素都是回调函数的返回值
描述
map()
方法时一个迭代方法。它为数组中的每个元素调用一次提供的callbackFn
函数,并用结果构建一个新数组
callbackFn
仅在已分配值得数组索引处被调用。它不会在稀疏数组中的空槽处被调用
map()
方法是一个复制方法。它不会改变this
。然而,作为callbackFn
提供的函数可以更改数组。在第一次调用callbackFn
之前,数组的长度已经被保存。因此:
- 当开始调用
map()
时,callbackFn
将不会访问超出数组初始长度的任何元素 - 对已访问索引的更改不会导致再次在这些元素上调用
callbackFn
- 如果数组中一个现有的、尚未访问的元素被
callbackFn
更改,则它传递给callbackFn
的值将是该元素被修改后的值。被删除的元素则不会被访问到
map()
方法是通用的。它只期望this
值具有length
属性和整数键属性
示例
1 | const numbers = [1, 4, 9] |
Array.of()
Array.of()
静态方法通过可变数量的参数创建一个新的Array
实例,而不考虑参数的数量或类型
语法
1 | Array.of() |
参数
element
用于创建数据的元素。可以是一个或 N 个
返回值
新的Array
实例
描述
Array.of()
和Array()
构造函数之间的区别在于对单个参数的处理:Array.of(7)
创建一个具有单个元素 7 的数组,而Array(7)
创建一个 length 为 7 的空数组(7 个空槽,而不是 7 个 undefined
)
1 | Array.of(7) // [7] |
示例
1 | Array.of(1) // [1] |
Array.prototype.pop()
pop()
方法从数组中删除最后一个元素,并返回该元素的值。此方法会改变数组的长度
语法
1 | pop() |
返回值
从数组中删除的元素(当数组为空时返回 undefined)
描述
pop()
方法从一个数组中删除并返回最后一个元素给调用者
pop()
是修改方法,其改变了this
的长度和内容
pop()
方法是通用的。它只期望this
值具有length
属性和整数键属性。虽然字符串也是类数组对象,但是由于其不能被修改,所以pop()
方法并不能应用在字符串上
示例
1 | // 在非数组对象上调用 pop() |
Array.prototype.push()
push()
方法将指定的元素添加到数组的末尾,并返回新的数组长度
语法
1 | push() |
参数
element
添加到数组末尾的元素
返回值
调用方法的对象的新 length 属性
Array.prototype.reduce()
reduce()方法对数组中的每个元素按序执行一个提供的 reducer 函数
语法
1 | reduce(callbackFn) |
参数
callbackFn
为数组中每个元素执行的函数。其返回值将座位下一次调用callbackFn
时的accumulator
参数。对于最后一次调用,返回值将作为reduce()
的返回值。该函数被调用时将传入以下参数:accumulator
上一次调用callbackFn
的结果。在第一次调用时,如果指定了initialValue
则为指定的值,否则为array[0]
的值currentValue
当前元素的值。在第一次调用时,如果指定了initialValue
,则为array[0]
的值,否则为array[1]
currentIndex
currentValue
在数组中的索引位置。在第一次调用时,如果指定了initialValue
则为0,否则为1array
调用了reduce()
的数组本身
initialValue
可选。第一次调用回调时初始化accumulator
的值,如果指定了initialValue
,则callbackFn
从数组中的第一个值作为currentValue
开始执行,如果没用指定,则accumulator
初始化为数组中的第一个值,并且callbackFn
从数组中的第二个值作为currentValue
开始执行。在这种情况下,如果数组为空(没有第一个值可以作为accumulator
返回),则会抛出错误
返回值
使用reducer
回调函数遍历整个数组后的结果
异常
如果数组为空且未提供initialValue
,则会抛出异常 TypeError
描述
callbackFn
仅对已分配值得数组索引进行调用。不会对稀疏数组中的空槽进行调用
reduce()
不接受thisArg
参数。callbackFn
调用时始终以undefined
作为this
的值,如果callbackFn
未处于严格模式,则该值将被替换为globalThis
reduce()
不会改变被调用的数组,但是作为callbackFn
提供的函数可能会改变数据。
在第一次调用callbackFn
之前,数组的长度会被保存,因此:
- 当开始调用
reduce()
时,callbackFn
将不会访问超出数组初始长度的任何元素 - 对已访问索引的更改不会导致再次在这些元素上调用
callbackFn
- 如果数组中的一个现有的、尚未访问的元素被
callbackFn
更改,则它传递给callbackFn
的值将是该元素被修改后的值,被删除的元素则不会被访问
如果数组只有一个元素(无论位置如何)且未提供initialValue
,或者提供了initialValue
但数组为空,则将返回该单个值,而不调用callbackFn
reduce()
会跳过稀疏数组中缺失的元素,但不会跳过undefined
值
示例
1 | // 展开嵌套数据 |
Array.prototype.reduceRight()
该方法是从右到左的顺序遍历,其他同Array.prototype.reduce()
Array.prototype.reverse()
reverse()
方法会倒转数组中元素的顺序,并返回该数组的引用地址
语法
1 | reverse() |
返回值
原始数组反转后的引用。该方法会改变原始数组,而不是复制
描述
reverse()
方法会保留空槽
reverse()
方法是通用的。它只期望this
具有length
属性和正数键属性。虽然字符串也是类似于数组的,但这个方法不适用于它们,因为字符串是不可变的
示例
1 | // 对稀疏数组使用 reverse() |
Array.prototype.shift()
shift()
方法从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度
语法
1 | shift() |
返回值
从数组中删除的元素;如果数组为空则返回undefined
描述
shift
方法移除索引为 0 的元素,并将后续元素的下标依次向前移动,然后返回被移除的元素。如果length
属性的值为 0,则返回undefined
shift()
方法是一个改变方法。它改变了this
的长度和内容
shift()
方法是通用的。它只期望this
值具有length
属性和整数键属性
示例
1 | const myFish = ["angel", "clown", "manage", "surgeon"]; |
Array.prototype.slice()
slice()
方法返回一个新的数组对象,这一对象是一个由start
和end
决定的原数组的浅拷贝,其中start
和end
代表了数组元素的索引。原始数组不会被改变
语法
1 | slice() |
参数
start
可选 提取的开始索引(默认为0),会转换为整数- 如果索引为负数,则从数组末尾开始计算(
start + array.length
) - 如果
start + array.length < 0
,或者没有提供start
,则使用 0 - 如果
start
大于数据长度,则不提取任何元素
- 如果索引为负数,则从数组末尾开始计算(
end
可选 提取终止处的索引,会转换为整数。slice()
会提取到不包括end
的位置- 如果索引为负数,则从数组末尾开始计算(
end + array.length
) - 如果
end + array.length < 0
,则使用 0 - 如果
end >= array.length
或者没有提供end
,则使用array.length
,提取所有元素直到末尾 - 如果
end
在规范化后小于或等于start
,则不提取任何元素
- 如果索引为负数,则从数组末尾开始计算(
返回值
一个含有被提取元素的新数组
描述
slice()
方法是一个复制方法,它不会改变this
,而是返回一个浅拷贝
slice()
方法会保留空槽,如果被切片的部分是稀疏的,则返回的数组也是稀疏的
slice()
方法是通用的。它只要求this
上有length
属性和整数键属性
示例
1 | // 在类数组对象上调用 slice() |
Array.prototype.some()
some()
方法测试数组中是否至少有一个元素通过了由提供的函数实现的测试。如果在数组中找到一个元素使得提供的函数返回 true,则返回 true,否则返回 false。它不会修改数组
语法
1 | some(callbackFn) |
参数
callbackFn
为数组中的每个元素执行的函数。该函数被调用时将传入以下参数:element
数组中当前正在处理的元素index
正在处理的元素在数组中的索引array
调用了some()
的数组本身
thisArg
可选 执行callbackFn
时用作this
的值
返回值
如果回调函数对数组中至少一个元素返回真值,则返回 true,否则返回 false
描述
some()
方法是一个迭代方法。它为数组中的每个元素调用一次指定的callbackFn
函数,直到callbackFn
返回一个真值。如果找到这样的元素,some()
方法会立即返回true
并停止遍历数组。否则,如果callbackFn
对所有元素都返回假值,some()
就会返回false
对于一个空数组,任何条件下都返回false
callbackFn
仅针对已分配值的数组索引调用。它不会为稀疏数组中的空槽调用
some()
不会改变调用它的数组,但指定的callbackFn
函数可以。数组的长度是在第一次调用callbackFn
之前保存的,因此:
- 当开始调用
some()
时,callbackFn
将不会访问超出数组初始长度的任何元素 - 对已访问索引的更改不会导致再次在这些元素上调用
callbackFn
- 如果数组中一个现有的、尚未访问的元素被
callbackFn
更改,则它传递给callbackFn
的值将是该元素被修改后的值。被删除的元素则不会被访问
some()
方法是通用的。它只期望this
值具有length
属性和整数键属性
示例
1 | // some() 不会在空槽上运行它的断言函数 |
Array.prototype.sort()
sort()
方法就地对数组的元素进行排序,并返回对相同数组的引用。默认排序是将元素转换为字符串,然后按照它们的 UTF-16 码元值升序排序
语法
1 | sort() |
参数
compareFn
可选。定义排序顺序的函数。返回值应该是一个数字。其正负性表示两个元素的相对顺序。该函数使用以下参数调用:a
第一个用于比较的元素。不会是undefined
b
第二个用于比较的元素,不会是undefined
如果省略该函数,数组元素会被转换为字符串,然后根据每个字符的 Unicode 码位值进行排序
返回值
经过排序的原始数组的引用
描述
如果没有提供compareFn
,所有非undefined
的数组元素都会被转换为字符串,并按照 UTF-16 码元顺序比较字符串进行排序。例如:在数值排序中,9 出现在 80 之前,但因为数字会被转换为字符串,在 Unicode 顺序中 “80” 排在 “9” 之前。所有的undefined
元素都会被排序到数组的末尾
sort()
方法保留空槽。如果源数组是稀疏的,则空槽会被移动到数组的末尾,并始终排在所有undefined
元素的后面
如果提供了compareFn
,所有非undefined
的数组元素都会按照比较函数的返回值进行排序(所有的undefined
元素都会被排序到数组的末尾,并且不调用compareFn
)
| compareFn(a,b)
返回值 | 排序顺序 |
| :——————–: | :——————–: |
| >0 | a
放到b
后 |
| <0 | a
在b
前 |
| ===0 | 保持a
和b
原来的顺序 |
sort()
方法是通用的,它只期望this
值具有length
属性和整数键属性。虽然字符串也类似于数组,但此方法不适用于字符串,因为字符串是不可变的
示例
1 | // 对象数组的排序 |
Array.prototype.splice()
splice()
方法通过移除或者替换已存在的元素和/或添加信元素就地改变一个数组的内容
语法
1 | splice(start) |
参数
start
从0开始计算的索引,表示要开始改变数组的位置,它会被转换成整数- 负索引从数组末尾开始计算,如果
start < 0
,使用start + array.length
- 如果
start < -array.length
,使用0
- 如果
start >= array.length
,则不会删除任何元素,但是该方法会表现为添加元素的函数,添加所提供的哪些元素 - 如果
start
被省略了(即调用splice()
时不传递参数),则不会删除任何元素。这与传递undefined
不同,后者会被转换为 0
- 负索引从数组末尾开始计算,如果
deleteCount
可选。一个整数,表示数组中要从start
开始删除的元素数量- 如果不传,从
start
删到数组末尾 - 如果大于或等于从
start
到数组末尾的长度,从start
删到数组末尾 - 如果想要删除
start
后的所有元素并插入值,可以传Infinity
,如果不传的话,显示的undefined
会转换为 0 - 如果传 0 或者负数,则不会移除任何元素
- 如果不传,从
item1,...,itemN
可选 从start
开始要加入到数组中的元素,如果不指定,splice()
将只从数组中删除元素
返回值
一个包含了删除的元素的数组
如果只移除一个元素,则返回一个元素的数组
如果没有删除任何元素,则返回一个空数组
描述
splice()
方法是一个修改方法,它可能会改变this
的内容,如果要插入的元素数量与要删除的元素数量不同,数组的length
也会改变
如果删除的部分是稀疏的,则splice()
返回的数组也是稀疏的,对应的索引为空槽
splice()
方法是通用的,它只期望this
值具有length
属性和整数键属性(不包括字符串)
示例
1 | // splice() 方法读取 this 的 length 属性,然后根据需要更新整数键属性和 length 属性 |
Array.prototype.toLocaleString()
toLocaleString()
方法返回一个字符串,表示数组中的所有元素。每个元素通过调用它们自己的toLocaleString
方法转换为字符串,并且使用特定于语言环境的字符串(例如逗号)分隔开
语法
1 | toLocaleString() |
参数
locales
可选。带有 BCP47 语言标签的字符串,或者此类字符串的数组options
可选。一个具有配置属性的对象
返回值
一个字符串,表示数组中的所有元素
描述
Array.prototype.toLocaleString
方法遍历数组内容,并使用提供的locales
和options
参数调用每个元素的toLocaleString
方法,通过由实现定义的分隔符将转换后的字符串拼接起来。方法本身并不使用这两个参数,而是将其传递给每个元素的toLocaleString()
。分隔符的选择取决于主机当前的语言环境,而不是locales
参数
如果一个元素是undefined
、null
,它会被转换为空字符串,而不是"null"
或者"undefined"
当用于稀疏数组时,toLocaleString()
方法迭代时会把空槽当作undefined
一样处理它
toLocaleString()
方法是通用的,它只期望this
值具有length
属性和整数键属性
示例
数组元素通过使用他们的toLocaleString
方法转换为字符串
Object
Number
Date
1 | // 显示货币符号 |
toLocaleString()
将空槽视为undefined
,并生成一个额外的分隔符
1 | [1, , 3].toLocaleString() // '1,,3 |
在非数组对象上,toLocaleString()
方法读取this
的length
属性,然后访问每个整数索引
1 | const arrayLike = { |
Array.prototype.toReversed()
Array
实例的toReversed()
方法是reverse()
方法对应的复制版本。它返回一个元素顺序相反的新数组
与reverse()
的区别
- 当用于稀疏数组时,
toReversed()
方法迭代空槽,就像他们的值是undefined
一样 toReversed()
不改变原始数组,而是返回一个新的数组
Array.prototype.toSorted()
Array
实例的toSorted()
方法是sort()
方法的复制方法版本。它返回一个新数组,其元素按升序排列
与sort()
的区别
toSorted()
迭代时会将空槽视为具有undefined
值的元素toSorted()
不改变原始数组,而是返回一个新的数组
Array.prototype.toSpliced()
Array
实例的toSpliced()
方法是splice()
方法的复制版本。它返回一个新数组,并在给定的索引处删除和/或替换了一些元素
与splice()
的区别
toSpliced()
方法在新数组中空槽将会被替换成undefined
toSpliced()
不改变原始数组,而是返回一个新数组。因此,该方法不会返回已删除的元素
Array.prototype.toString()
toString()
方法返回一个字符串,表示指定的数组及其元素
语法
1 | toString() |
返回值
一个表示数组元素的字符串
描述
Array
对象覆盖了Object
的toString
方法。数组的toString
方法实际上在内部调用了join()
方法来拼接数组并返回一个包含所有数组元素的字符串,元素之间用逗号分隔。如果join
方法不可用或者不是函数,则会使用Object.prototype.toString
来代替,并返回[object Array]
1 | const ary = [] |
当数组需要被表示为文本值,或者当数组在字符串拼接中被引用时,JavaScript 会自动调用toString
方法
示例
1 | // const ary1 = [1, 2, 'a', '1a'] |
Array.prototype.unshift()
unshift()
方法将指定元素添加到数组的开头,并返回数组的新长度
语法
1 | unshift() |
参数
element
添加到arr
开头的元素
返回值
返回调用方法对象的新length
属性
描述
unshift()
方法将给定的值插入到数组对象的开头
如果多个元素作为参数传递,它们将被插入到对象开头的块中,插入顺序与它们作为参数传递的顺序完全相同。因此,调用一次unshift()
方法并传递n
个参数,与调用n
次并传递 1 个参数,不会产生相同的结果
1 | let arr = [4, 5, 6] |
unshift()
方法是通用的。它只期望this
值具有length
属性和整数键属性(该方法不适用于字符串)
示例
1 | const arr = [1, 2]; |
Array.prototype.values()
values()
方法返回一个新的数组迭代器对象,该对象迭代数组中每个元素的值
语法
1 | values() |
返回值
一个新的可迭代迭代器对象
描述
Array.prototype.values()
是Array.prototype[@@iterator]()
的默认实现
1 | Array.prototype.values === Array.prototype[Symbol.iterator] // true |
当应用于稀疏数组时,values()
方法会将空槽作为undefined
迭代
values()
方法是通用的,它只需要this
值具有length
属性和整数键属性
示例
1 | // 由于 values() 返回一个可迭代迭代器对象,可以使用 for……of 循环来迭代它 |
Array.prototype.with()
Array
实例的with()
方法是使用方括号表示法修改指定索引值的复制方法版本。它会返回一个新数组,其指定索引处的值会被新值替换
语法
1 | array.with(index, value) |
参数
index
要修改的数组索引,将会转换为整数- 负数索引规则:
index + array.length
- 如果规范化后的索引超出数组边界,会抛出
RangeError
- 负数索引规则:
value
要分配给指定索引的任何值
返回值
一个全新的数组,其中index
索引处的元素被替换为value
异常
RangeError
index > array.length
或index < -array.length
时抛出
描述
with()
通过返回一个指定索引处的值被新值替换的新数组,来改变数组中指定索引处的值。原数组不会被改变
如果原数组是稀疏数组,新数组对应的空白索引位置会被替换为undefined
with()
方法是通用的,它只期望this
值具有length
属性和整数键属性
示例
1 | // with() 方法会读取 this 上的 length 属性,之后读取 this 上的每个整数键并写入到新数组中,同时 value 会被写入指定的 index |