You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么TypeScript中用数字作为对象键时会被自动排序?

现象原因解释

你遇到的是JavaScript普通对象的原生特性,和TypeScript语法无关,不属于运行异常。

复现代码

let dict: {[key: string]: number} = {};
const arr = [123, 333, 10, 4];

for (let el of arr) {
    dict[el] = 1;
}
console.log(dict);
// 实际输出:{ '4': 1, '10': 1, '123': 1, '333': 1 }

对应的控制台输出效果如下:
控制台输出的排序后字典示例

具体规则(ES6及以上标准约定)

普通对象的属性在打印、遍历时,会按照固定优先级排序,和插入顺序无关:

  • 第一优先级:所有可转换为非负整数的字符串属性名,按照数字升序排列
  • 第二优先级:不可转换为非负整数的普通字符串属性名,按照属性创建的先后顺序排列
  • 第三优先级:Symbol类型的属性名,按照属性创建的先后顺序排列

你代码中作为键的数字会被自动转为字符串,属于第一优先级的属性名,所以会被强制按数字大小排序,而你用普通字符串作为键时,属于第二优先级,会保留插入顺序,和你观察到的现象完全吻合。

保留插入顺序的方案

如果业务需要严格保留键的插入顺序,建议使用Map数据结构,它的遍历顺序完全遵循插入顺序,不受键类型的影响:

// 使用Map替代普通对象
const map = new Map<number, number>();
const arr = [123, 333, 10, 4];

for (let el of arr) {
    map.set(el, 1);
}
// 遍历顺序和插入顺序完全一致:123 → 333 → 10 → 4
for (const [key, value] of map) {
    console.log(key, value);
}

内容的提问来源于stack exchange,提问作者davila795

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:57:03