JS 数组方法总结

112 阅读4分钟

总结表格

分类方法ES版本是否改变原数组空槽处理返回值
创建[]ES3N-Array
new Array()ES3N-Array
Array()ES3N-Array
Array.from()ES6Nhole → undefinedArray
Array.of()ES6N保留 holeArray
填充/复制fill()ES6Yhole 会变为指定值Array
copyWithin()ES6Y保留 holeArray
转换/切片slice()ES3N保留 holeArray
splice()ES3Y保留 holeArray(删除元素)
toSpliced()ES2023N保留 holeArray
with()ES2023N保留 holeArray
栈/队列push()ES3Y-新 length
pop()ES3Y-被删除元素
unshift()ES3Y-新 length
shift()ES3Y-被删除元素
合并/归并/转字符串concat()ES3N保留 holeArray
flat()ES2019N会去掉 holeArray
flatMap()ES2019N会去掉 holeArray
reduce()ES5N跳过 hole累积值
reduceRight()ES5N跳过 hole累积值
join()ES3N会当 undefined → ''String
查找at()ES2022N跳过 hole元素/undefined
find()ES6N跳过 hole元素/undefined
findLast()ES2023N跳过 hole元素/undefined
findIndex()ES6N跳过 hole索引/-1
findLastIndex()ES2023N跳过 hole索引/-1
indexOf()ES5N跳过 hole索引/-1
lastIndexOf()ES5N跳过 hole索引/-1
includes()ES6N跳过 holeBoolean
some()ES5N跳过 holeBoolean
every()ES5N跳过 holeBoolean
filter()ES5N跳过 holeArray
排序reverse()ES3Y保留 holeArray
toReversed()ES2023N保留 holeArray
sort()ES3Y保留 holeArray
toSorted()ES2023N保留 holeArray
遍历forEach()ES5N跳过 holeundefined
map()ES5N跳过 holeArray
keys()ES6N保留 holeIterator
values()ES6N保留 holeIterator
entries()ES6N保留 holeIterator

由此可见,改变原数组的方法只有 栈/队列fill/copyWith两个旧的排序splice 方法,其他的都不会改变元素组。

大部分方法会保留或跳过 hole,只有 Array.from 会把 hole 变成 undefined、flat/flatMap 会把 hole 去掉、fill 会填充 hole、join 会把 hole 当作 undefined 转换为''。

按功能分类

创建方法

  • new Array()
  • Array()
  • 字面量 []
  • Array.from() (ES6)
  • Array.of() (ES6)

静态方法

  • Array.isArray()
  • Array.from()
  • Array.of(),与 Array.from() 区别在于
  1. Array.from() 会将 hole 转换为 undefined,而 Array.of() 会保留 hole。
const arr = [1, , 3]
console.log(Array.from(arr)) // [1, undefined, 3]
console.log(Array.of(arr)) // [[1, 空, 3]]
  1. Array.from() 将类数组对象或可迭代对象转换为数组,Array.of() 将一组参数转换为数组。
Array.from('foo') // ['f', 'o', 'o']
Array.of('foo') // ['foo']

const map = new Map([
  [1, 2],
  [2, 4],
  [4, 8],
]);
Array.from(map) //  [Array(2), Array(2), Array(2)]
Array.of(map) // [Map(3)]

Array.from({a:1}) // []
Array.of({a:1}) // [{a: 1}]

Array.from(1) // []
Array.of(1) // [1]

填充方法

  • fill() (ES6,填充数组,会覆盖原数组,函数签名 array.fill(value, start, end)
  • copyWithin() (ES6,会覆盖原数组,将数组元素复制到数组中的另一个位置,覆盖现有值,不会添加更多项,函数签名 array.copyWithin(targetIndex, start, end)

转换

  • slice() (不改原数组,浅拷贝,不包含 end,支持负索引)
  • splice() (改原数组,返回删除项,支持负索引,函数签名 array.splice(index, howmany, item1, ..., itemX)
  • toSpliced() (ES2023,不改原数组,返回新数组)
  • with() (ES2023,替换某个元素,不改原数组,返回新数组)

栈和队列

  • push() (从后面塞,返回新长度)
  • pop() (从后面出,返回出的)
  • unshift() (从前面塞,返回新长度)
  • shift() (从前面出,返回出的)

合并

  • concat() (连接多个数组,不改原数组,返回新数组)

转字符串

  • join() (默认填充逗号,返回字符串)
  • toString() (默认填充逗号,返回字符串)

归并计算

  • reduce() (从左往右归并,不改变原数组,函数签名 array.reduce(function(total, currentValue, currentIndex?, arr?), initialValue?)
  • reduceRight() (从右往左归并)

查找

  • at() (ES2022,支持负索引,无参返回第一个,-1 返回最后一个)
  • indexOf() (ES5,从头找,找到返回第一个,否则 -1)
  • lastIndexOf() (ES5,从后找,找到返回最后一个,否则 -1)
  • includes() (与 indexOf 的区别是可以查找 NaN,返回 boolean)

查找(参数是回调函数的)

  • find() (ES6,返回第一个满足断言的,否则 undefined)
  • findIndex() (ES6,返回第一个满足断言的索引,否则 -1)
  • findLast() (ES2023,返回最后一个满足断言的,否则 undefined)
  • findLastIndex() (ES2023,返回最后满足断言的索引,否则 -1)

以上四种函数声明都是 array.<funcName>(function(currentValue, index?, arr?) , thisValue?)

  • some()
  • every()

过滤

  • filter()

排序

  • reverse()
  • toReversed() (ES2023,不改原数组,返回新数组)
  • sort()
  • toSorted() (ES2023,不改原数组,返回新数组)

拍平

  • flat() (展开嵌套子数组,可指定深度,默认 1)
  • flatMap() (函数签名 array.flatMap(function(currentValue, index?, arr?), thisValue?),效果类似于 flat + map)

遍历

  • forEach() (ES5)
  • map() (ES5)
  • keys() (ES6,返回迭代器,可被 for...of 遍历,对象的内置方法)
  • values() (ES6,返回迭代器,可被 for...of 遍历,对象的内置方法)
  • entries() (ES6,返回有键值对的迭代对象,可被 for...of 遍历,对象的内置方法)

for...of 无法遍历到数组的对象属性,只能遍历索引列表里的元素,length 也只对索引列表计数,hole 读出为 undefined