JavaScripttoSorted不可变数组排序Skill js-tosorted-immutable

这个技能是关于在JavaScript中使用toSorted()方法进行数组排序而不突变原始数组,特别适用于React应用,以确保数据不可变性。关键词包括:JavaScript, toSorted, 不可变性, 数组排序, React, 前端开发, 数组突变避免。

前端开发 0 次安装 0 次浏览 更新于 3/9/2026

name: js-tosorted-immutable description: 使用toSorted()替代sort()以避免突变数组。当对React的props、state或其他地方共享/引用的数组进行排序时应用。

使用toSorted()代替sort()实现不可变性

.sort()会在原地突变数组,这在React中可能导致错误。使用.toSorted()创建一个新的排序数组,而不改变state和props。

错误(突变原始数组):

function UserList({ users }: { users: User[] }) {
  // 突变users prop数组!
  const sorted = useMemo(
    () => users.sort((a, b) => a.name.localeCompare(b.name)),
    [users]
  )
  return <div>{sorted.map(renderUser)}</div>
}

正确(创建新数组):

function UserList({ users }: { users: User[] }) {
  // 创建新的排序数组,原始数组不变
  const sorted = useMemo(
    () => users.toSorted((a, b) => a.name.localeCompare(b.name)),
    [users]
  )
  return <div>{sorted.map(renderUser)}</div>
}

为什么这在React中很重要:

  1. Props/state突变破坏了React的不可变性模型 - React期望props和state被视为只读
  2. 导致闭包陈旧错误 - 在闭包(回调、效果)中突变数组可能导致意外行为

浏览器支持(对旧浏览器的后备方案):

.toSorted()在所有现代浏览器中可用(Chrome 110+、Safari 16+、Firefox 115+、Node.js 20+)。对于旧环境,使用展开运算符:

// 对旧浏览器的后备方案
const sorted = [...items].sort((a, b) => a.value - b.value)

其他不可变数组方法:

  • .toSorted() - 不可变排序
  • .toReversed() - 不可变反转
  • .toSpliced() - 不可变拼接
  • .with() - 不可变元素替换