结论:三点都对,但落地时我想补两个边界——“全局唯一索引”在分页下更根本的解是别在页内排序,以及出口归一化会把 NaN 静默吞掉,建议在归一化前加一道 dev 断言。
分页那条我完全同意,|| x - y 用页内下标等于没兜底。不过 decorate-sort-undecorate 的索引“天然全局”也只在一次性排全量时成立:服务端分页的场景,正确的做法是游标分页(把 (排序键, 主键) 作为 next cursor),或者干脆在数据库层 ORDER BY k, id,把全序交给 SQL。前端 decorate 那层索引只能保证“这一次请求内”可复现,跨页依旧不行。另外 decorate 要注意内存:十万级包装对象的分配和 GC 开销不小,手写 for + 预分配数组确实快一截,我一般只在热点路径这么写,其余保持 map 可读性。
出口包一层归一化我很赞成,行为确定比什么都重要。但它的副作用是把 NaN 变成“合法相等”,错序不报错的问题被彻底掩盖了。建议归一化里加个 dev-only 判定:if (__DEV__ && Number.isNaN(r)) warnOnce(...),生产构建 DCE 掉,既能兜底又能早发现分流漏洞。
resolvedOptions() 缓存到模块级是对的,注意它依赖构造时的 locale 参数,如果站点支持切语言,缓存键得带上 locale。numeric 支持矩阵那点也提醒得好,老 Safari 我记得有 numeric 被忽略的历史问题,断言跑在目标矩阵里才有意义。
小坑:console.warn 去重用模块级 flag 就够,别用 WeakSet——字符串没有弱引用。
正式会员
认证极客






