ECMAScript 2023
- 从尾到头搜索数组
在 JavaScript 中,通过find()
和findIndex()
查找数组中的值是一种常见做法。不过,这些方法从数组的开始进行遍历:const array = [{v: 1}, {v: 2}, {v: 3}, {v: 4}, {v: 5}];array.find(elem => elem.v > 3); // {v: 4} array.findIndex(elem => elem.v > 3); // 3
findLast()
会返回第一个查找到的元素,如果没有找到,就会返回 undefined;findLastIndex()
会返回第一个查找到的元素的索引。如果没有找到,就会返回 -1;const array = [{v: 1}, {v: 2}, {v: 3}, {v: 4}, {v: 5}];array.findLast(elem => elem.v > 3); // {v: 5}array.findLastIndex(elem => elem.v > 3); // 4array.findLastIndex(elem => elem.v > 5); // undefined
-
通过副本更改数组
方法有4个
Array.prototype.toReversed()
Array.prototype.toSorted()
Array.prototype.toSpliced()
Array.prototype.with()
我们知道,大多数的数组方法都是非破坏性的,也就是不会改变原数组,比如filter()
方法
当然,也有一些是破坏性的方法,它们在执行时会改变原数组,比如sort()
方法
在数组的方法中,下面的方法是具有破坏性的:
reverse()
sort()
splice()
如果想要不破坏数组,需要创建一个数组副本,对副本进行修改,因此就引入了这三个方法的非破坏性版本,因此不需要手动创建副本再进行操作了reverse()
的非破坏性版本:toReversed()
sort()
非破坏性版本:toSorted(compareFn)
splice()
非破坏性版本:toSpliced(start, deleteCount, ...items)
除此之外,还有了一个新的非破坏性方法:with()
。该方法会以非破坏性的方式替换给定 index 处的数组元素,即arr[index]=value
的非破坏性版本。
类型化数组也是数组,只不过其元素被设置为特定类型的值。类型化数组的核心就是一个名为 ArrayBuffer 的类型。每个 ArrayBuffer 对象表示的只是内存中指定的字节数,但不会指定这些字节用于保存什么类型的数据。通过 ArrayBuffer 能做的就是为了将来使用而分配一定数量的字节。
这些方法也适用于元组,元组相当于不可变的数组。它们拥有数组的所有方法 —— 除了破坏性的方法toReversed()
是reverse()
方法的非破坏性版本:const arr = ['a', 'b', 'c']; const result = arr.toReversed(); console.log(result); // ['c', 'b', 'a'] console.log(arr); // ['a', 'b', 'c']
toSorted()
是sort()
方法的非破坏性版本:const arr = ['c', 'a', 'b']; const result = arr.toSorted(); console.log(result); // ['a', 'b', 'c'] console.log(arr); // ['c', 'a', 'b']
splice()
方法比其他几种方法都复杂,其使用形式:splice(start, deleteCount, ...items)
。该方法会从从 start 索引处开始删除 deleteCount 个元素,然后在 start 索引处开始插入 item 中的元素,最后返回已经删除的元素。
toSpliced 是splice()
方法的非破坏性版本,它会返回更新后的数组,原数组不会变化,并且无法再得到已经删除的元素:const arr = ['a', 'b', 'c', 'd']; const result = arr.toSpliced(1, 2, 'X'); console.log(result); // ['a', 'X', 'd'] console.log(arr); // ['a', 'b', 'c', 'd']
.with()
方法的使用形式:.with(index, value)
,它是arr[index] = value
的非破坏性版本:const arr = ['a', 'b', 'c']; const result = arr.with(1, 'X'); console.log(result); // ['a', 'X', 'c'] console.log(arr); // ['a', 'b', 'c']