Array toSorted怎么配置或排查
如果页面只是想“排好序但不影响原数据”,优先用 toSorted();如果业务明确允许直接改动当前数组,才继续用 sort()。排查时最容易漏掉两点:toSorted 不是所有旧运行环境都存在,且不传比较函数时数字会按字符串顺序排列。
toSorted()返回新数组,原数组保持不变;sort()在原数组上排序。- 数字使用
(a, b) => a - b,对象则按明确字段比较。 - 遇到“不是函数”先查运行环境;兼容旧环境可用复制加
sort()的写法。
toSorted 和 sort 的差别,先看是否修改原数组
toSorted() 是复制版本的排序方法,调用后得到一个新的数组引用。sort() 则直接改变原数组,并返回这个原数组引用。这个差别会影响 React 状态、缓存数据和需要保留原始顺序的筛选逻辑。
| 写法 | 是否修改输入 | 返回值 | 适合场景 |
|---|---|---|---|
toSorted() | 否 | 新数组 | 派生列表、状态更新 |
sort() | 是 | 原数组引用 | 明确允许原地更新 |
例如下面的比较能直接暴露引用边界:
const source = [3, 1, 2];
const copy = source.toSorted((a, b) => a - b); // 中文说明:数值升序,并创建新数组
console.log(source); // [3, 1, 2]
console.log(copy); // [1, 2, 3]
const same = source.sort((a, b) => a - b); // 中文说明:原地排序,返回原数组引用
console.log(same === source); // true

数字和对象排序为什么要写 compareFn
省略 compareFn 时,数组元素会转换为字符串,再按 Unicode/UTF-16 顺序比较。所以 [1, 10, 2] 的默认结果不是数值升序。数字数组应明确返回差值;对象数组则要把业务字段取出来比较。
const scores = [1, 10, 2];
const numericOrder = scores.toSorted((a, b) => a - b); // 中文说明:返回负数表示 a 排在 b 前面
const users = [
{ name: "Lin", score: 80 },
{ name: "Mia", score: 95 },
{ name: "Kai", score: 72 },
];
const byScore = users.toSorted((a, b) => a.score - b.score); // 中文说明:只按 score 字段升序,不改 users
console.log(numericOrder); // [1, 2, 10]
console.log(byScore.map((user) => user.name)); // ["Kai", "Lin", "Mia"]
比较函数要保持纯粹、稳定,并让相反参数得到相反方向的结果。不要在比较函数里修改对象、累加外部计数或返回真假值;true/false 不能表达完整的前后关系。

遇到 toSorted 不生效,按环境和数据边界排查
控制台若出现 toSorted is not a function,通常不是数组内容问题,而是当前浏览器、Node.js 或运行时版本没有提供这个方法。MDN 将它列为 2023 年 7 月起跨浏览器可用的基线能力,但项目仍应以实际支持矩阵为准,尤其要照顾旧 WebView 和旧构建目标。
兼容旧环境时,先复制再原地排序,语义上仍然是不改原数组:
function sortedCopy(list, compareFn) {
// 中文说明:slice 创建浅拷贝,sort 只作用于副本;compareFn 由调用方决定顺序
return list.slice().sort(compareFn);
}
const result = sortedCopy([3, 1, 2], (a, b) => a - b);
console.log(result); // [1, 2, 3]
还要注意稀疏数组:toSorted() 会把空槽按 undefined 处理,并把它们放到结果末尾。若数据来自表单或接口,建议先决定空值应排在末尾还是参与业务排序,不要把空槽和显式 undefined 当成普通数字。
迁移后的最小回归检查清单
从 sort() 改成 toSorted() 后,不要只看页面列表顺序。至少检查以下四项:
- 引用检查:排序前后,原数组内容是否仍保持不变;返回值是否是新引用。
- 类型检查:数字、数字字符串和对象字段是否使用了正确的比较函数。
- 边界检查:空数组、重复值、
undefined、稀疏数组和缺失字段如何处理。 - 兼容检查:目标浏览器、Node.js、WebView 和测试运行时是否都支持;不支持时切换到复制加
sort()。
实际迁移中,最稳妥的决策不是把所有 sort() 全部替换掉,而是先确认调用方是否依赖原数组被改写。需要不可变派生数据就用 toSorted(),需要兼容旧环境就封装复制排序,只有确实要原地更新时才保留 sort()。
常见问题
toSorted 会深拷贝对象吗?
不会。它只创建新的数组容器,数组里的对象仍是原对象引用;若还要修改对象字段,需要另行设计拷贝策略。
为什么 toSorted 排数字还是错的?
常见原因是省略了 compareFn。请改用 (a, b) => a - b,并确认输入不是混合了数字和不可转换字符串的数据。
能用 Array.prototype.toSorted.call(arrayLike) 吗?
可以,方法只需要类似数组的 length 和整数索引属性;但业务代码通常先转成真正数组更直观,也更容易做类型约束。
Go channelrange 出错时怎么查等待不退
- 上一篇
- Go channelrange 出错时怎么查等待不退
- 下一篇
- Go url.JoinPath 如何控制用户路径
-
- 文章 · 前端 | 2小时前 | 前端 · typescript · javascript · TypeScript Node.js dom lib structuredClone
- structuredClone 类型怎么配置或排查
- 310浏览 收藏
-
- 文章 · 前端 | 3小时前 | css · 响应式布局 · Grid布局 · 前端排错 · subgrid · CSS subgrid配置 CSS Grid嵌套布局 grid-template-columns subgrid 网格轨道对齐 subgrid不生效排查
- CSS subgrid怎么配置或排查
- 371浏览 收藏
-
- 文章 · 前端 | 4小时前 | css · 响应式布局 · container query ·
- CSS container query怎么配置或排查
- 291浏览 收藏
-
- 文章 · 前端 | 7小时前 | 前端 · Web Worker · JavaScript性能 · ArrayBuffer postMessage Web Worker Transferable
- Web Worker 使用 Transferable 后如何把结果传回主线程
- 162浏览 收藏
-
- 文章 · 前端 | 8小时前 | javascript · esm · 前端排错 · Promise ESM dynamic import 前端模块加载
- ESM 动态 import 失败时如何显示降级界面
- 282浏览 收藏
-
- 文章 · 前端 | 9小时前 | 构建 · vite · 模块收集 · vite import.meta.glob 前端构建
- Vite import.meta.glob 如何限制构建时收集的文件
- 175浏览 收藏
-
- 文章 · 前端 | 11小时前 |
- CSS container query 为什么在子组件中不生效
- 400浏览 收藏
-
- 文章 · 前端 | 12小时前 | websocket · 断线重连 · 前端排障 · 指数退避 · JavaScript异步 · WebSocket断线重连 WebSocket重连定时器 JavaScript指数退避 前端实时连接
- WebSocket 断线重连如何避免多个定时器叠加
- 205浏览 收藏
-
- 文章 · 前端 | 14小时前 |
- Fetch AbortController 如何取消超时请求
- 108浏览 收藏
-
- 文章 · 前端 | 15小时前 | javascript · 前端性能 · IntersectionObserver · 图片懒加载 IntersectionObserver 前端性能
- IntersectionObserver 如何只加载进入视口的图片
- 491浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 110次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 25次使用
-
- OpenCompass
- OpenCompass是上海AI实验室推出的开源大模型评测平台,提供CompassKit、CompassHub和CompassRank三大核心组件,支持LLM及多模态模型的一站式标准化评估与排行榜查询。
- 44次使用
-
- AGI-Eval
- AGI-Eval是由上海交大等高校联合发布的大模型评测社区,提供公正透明的LLM能力榜单、多领域评测集及Data Studio数据服务,助力AI模型性能评估与NLP科研开发。
- 25次使用
-
- SuperCLUE
- SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
- 264次使用
-
- Go语言对前端领域的入侵WebAssembly运行原理
- 2022-12-31 130浏览
-
- Golang range slice 与range array 之间的区别
- 2022-12-31 182浏览
-
- Golang 拷贝Array或Slice的操作
- 2022-12-24 395浏览
-
- 在golang xorm中使用postgresql的json,array类型的操作
- 2022-12-24 162浏览
-
- Go 修改map slice array元素值操作
- 2023-01-07 178浏览

