toReversed()是ES2023新增的不可变数组反转方法,返回新数组而不修改原数组,应优先使用;React中需用useMemo缓存避免重复创建;不支持时应检测后降级为slice().reverse()。
Array.prototype.toReversed() 是 ES2023 新增的原生方法,它的设计目标就是替代 slice().reverse() 这类手动“不可变反转”的写法。它不修改原数组,而是返回一个全新数组,顺序相反——这正好契合函数式编程中“状态不可变”的核心约束。
常见错误是仍习惯性写成 arr.reverse()(会改原数组)或 arr.slice().reverse()(多一次拷贝),其实只要浏览器/运行时支持(Chrome 114+、Firefox 117+、Node.js 20.2+),直接用 toReversed() 最简洁安全。
const reversed = originalArray.toReversed();
originalArray.reverse();(原地修改)originalArray.slice().reverse();(两步操作,性能略差)在 React 组件中,如果每次渲染都调用 items.toReversed(),虽然结果正确,但会创建新数组实例,可能触发子组件不必要的重渲染(尤其当子组件用 React.memo 且依赖数组引用时)。
推荐把反序逻辑提前到数据源处理层或使用 useMemo 缓存:
const displayedItems = useMemo(() => items.toReversed(), [items]);
items 是稳定引用(如来自 useState 的数组),toReversed() 每次返回新数组是必然的,缓存能避免重复计算若需支持旧环境(如 IE、老版 Node.js 或某些小程序 runtime),不能直接调用 toReversed(),否则报错 TypeError: arr.toReversed is not a function。
安全做法是检测 + 降级,而不是全局 polyfill(polyfill 可能污染内置原型,尤其在第三方库共存时):
function safeReverse(arr) { return typeof arr.toReversed === 'function' ? arr.toReversed() : arr.slice().reverse();}
注意:不要用 Array.isArray(arr) && 'toReversed' in Array.prototype 判断——某些环境(如某些 WebKit 版本)可能有该属性但未实现,仍会报错。
ES2023 引入的这批“to-前缀”数组方法(toReversed、toSorted、toSpliced、toSorted)统一遵循“不修改原数组、返回新数组、浅拷贝”原则。它们和 map()、filter() 一样天然不可变,但比 slice().xxx() 更语义清晰、性能略优(V8 等引擎做了专门优化)。
实际项目中,一旦确定运行时支持,应优先使用这些原生方法,而非自己封装“immutableReverse”工具函数——后者容易引入边界 bug(比如没处理稀疏数组、TypedArray 等)。
真正容易被忽略的是:这些方法对 length 为 0 或 1 的数组也返回新数组,不是返回原引用;哪怕输入是空数组 [],[].toReversed() 也返回一个新空数组,这点和 map() 一致,但和某些手写 shallowClone 不同。