为什么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
相关产品推荐
相关产品推荐

