JavaScript数组新式只读副本方法toReversed()、toSorted()、toSpliced()均不修改原数组,返回新数组,支持链式调用与函数式编程;toReversed()逆序,toSorted()排序(可传比较函数),toSpliced()替代splice实现不可变增删改。

这三个方法是 JavaScript 数组的新式只读副本操作方法,它们不会修改原数组,而是返回一个新数组,天然支持函数式编程中的无副作用原则。
toReversed():安全地翻转数组顺序
替代 reverse()(会改变原数组),toReversed() 返回翻转后的新数组,原数组保持不变。
- 适用于需要展示倒序列表但又不能影响原始数据流的场景,比如日志时间线、消息历史回溯
- 直接链式调用,无需先拷贝:
arr.toReversed().map(item => item.id) - 注意它不接受参数,仅做简单逆序;若需按条件逆序,应配合
toSorted()
toSorted():按规则排序且不污染源数据
替代 sort()(原地排序,副作用明显),toSorted() 默认按字符串 Unicode 码点升序,也支持传入比较函数。
- 升序数字排序:
numbers.toSorted((a, b) => a - b) - 对象数组按字段排序:
users.toSorted((a, b) => a.name.localeCompare(b.name)) - 与
toReversed()组合实现降序:arr.toSorted((a, b) => b - a)或arr.toSorted().toReversed()
toSpliced():精准替换/删除/插入,全程不可变
替代 splice()(破坏性最强的数组方法之一),toSpliced(start, deleteCount, ...items) 返回修改后的新数组。
- 删除元素:
arr.toSpliced(1, 2)→ 删除索引 1 起的 2 个元素 - 替换元素:
arr.toSpliced(1, 1, 'new')→ 删除 1 个,插入 'new' - 插入元素:
arr.toSpliced(2, 0, 'a', 'b')→ 在索引 2 处插入两个新项 - 所有操作都不影响
arr,适合状态管理中生成新 state
它们共同特点是:不修改原数组、返回新数组、语法简洁、可链式调用。只要避免使用 push、pop、shift、unshift、splice、sort、reverse 这些原地方法,就能大幅降低意外状态污染的风险。










