先明确任务与结果
JavaScript数组sort()默认按字符串的UTF-16顺序比较,并会修改原数组。对本例限定的有限Number数组,复制后用(a,b)=>a-b排序,并拒绝混入的字符串与非有限值。编号不是自动可转成数值的数据,排序也不应顺手去重。
先把“升序”定义成可检查的契约
MDN的Array.sort说明解释了默认字符串顺序和原地修改。它们是两个独立问题:比较规则不对会排错;修改原数组则可能影响仍要保留输入顺序的后续步骤。
下面是编辑设计的JavaScript审查练习,没有向模型提交请求。任务限定为有限Number数组,按数值升序返回新数组,保留全部元素与重复值,原数组不变;不接受字符串、NaN或Infinity。这个契约不是所有项目的通用数据规范。
三种数据先分开
数值
按数值大小比较,先明确类型与有效范围。
编号
02和2可能是不同身份,不擅自转成相同数字。
展示文字
可能按语言或显示规则排序,不自动套数值规则。
让样本同时暴露错误和巧合通过
样本A为[2,11,3]。默认排序得到[11,2,3],数值升序参考为[2,3,11];11的开头字符1排在字符2之前,解释了为什么“看起来升序”不是数值升序。
样本B为[-2,-11,0,5]。默认结果恰好也是[-11,-2,0,5],因此只测这一组会漏掉A的问题。再加入空数组、重复值以及混合类型,才能检查本题的不同契约。
| 输入 | 本题要求的结果 | 检查对象 |
|---|---|---|
| [2,11,3] | [2,3,11] | 默认字符串规则会排错 |
| [-2,-11,0,5] | [-11,-2,0,5] | 某组巧合正确不证明规则通用 |
| [3,3,1] | [1,3,3] | 保留重复值 |
| [] | [],返回新数组 | 空输入和身份 |
| [2,'11',3] | 拒绝 | 混合类型不自动转换 |
| [2,NaN,3] | 拒绝 | 非有限值不进入比较 |
| Array(2) | 拒绝 | 空槽不属于有限Number |
参考实现同时固定比较、输入与副本
下面是人工作答参考,不是某个模型生成的修复。先检查数组,再用副本逐项核对有限Number,最后排序;空槽在副本中成为undefined,因此本题也拒绝稀疏数组。只加入减法比较函数,却允许字符串、缺失值或无穷值进入,仍然没有履行本题限定的输入契约。
复制只针对本题的Number数组。若输入改成对象数组,浅复制不会使内部对象自动独立;需要另行定义稳定键、字段缺失与相同值的规则。本例不把这段代码提升成任意数据清洗库。
function numericAscending(values) {
if (!Array.isArray(values) || ![...values].every(
value => typeof value === 'number' && Number.isFinite(value)
)) {
throw new TypeError('Expected finite Number values');
}
return [...values].sort((a, b) => a - b);
}
const input = [2, 11, 3];
const output = numericAscending(input);
// output: [2, 3, 11]
// input remains: [2, 11, 3]只补了一个比较函数
把任何输入都先Number转换,再sort((a,b)=>a-b),于是空字符串成0,编号02成2。
只在本题允许的有限Number输入上排序;其余输入拒绝或回到任务方确认转换规则。
把反例、原数组和异常一起交给AI审查
不要只要求“写一个升序函数”。提供七组样本,要求分别返回预期结果、说明原数组是否变化,并列出拒绝输入。审查代码后实际执行这些例子,错误、未运行和通过分别记录。
同一个数组引用也要检查:调用后原数组内容应与之前一致,结果应为新数组;重复元素的数量应保留。空数组依旧要返回新的空数组,不能因为没有可见元素就省略身份要求。
Review numericAscending for this contract: an array of finite JavaScript Number values; numeric ascending output in a new array; preserve duplicates; leave input unchanged. Use all seven cases above. Reject mixed strings and non-finite values rather than silently converting them. Explain why the default sort fails A but happens to pass B. Report unexecuted proposals separately from observed checks.实际执行时核对
- 每组有效输入的顺序与人工参考一致。
- 输入数组在调用前后内容不变。
- 输出不是输入数组本身。
- 重复值和元素总数保留。
- 混合类型与NaN按契约拒绝。
排序正确,仍不代表原始数据精确
有限Number并不保证任何巨大整数都被精确表示。精度边界可阅读JavaScript浮点数与误差容限核查;文件交接中的编号类型可参考JSON转Excel的数字原文检查。
如果输入其实是订单编号02、2、11,先确定身份与显示顺序;不要把数值排序当去重或编号标准化。本文的完整结果仅对应声明的数值契约,不包含所有语言排序、对象排序或文件导入行为。
常见问题
sort()返回了新变量名,为什么原数组还是变了?
新变量名不等于新数组。sort()返回正在被修改的同一数组引用;本例先复制,才能保留原顺序。
比较函数返回true或false可以吗?
不能把它当通用的数值升序比较器。比较规则需要表达小于、等于和大于;布尔结果不能完整表达这三种关系。
排序后要不要删除重复值?
本题明确保留重复值。去重是另一项有独立身份规则的任务,不能因为排序顺手添加。


