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

为何JavaScript对象中数字属性排在空字符串属性之前?

为什么JavaScript对象中数字属性会排在空字符串属性前面?

嘿,这个问题其实是JavaScript对象的属性枚举规则在作祟!先看看你的代码场景:

最初你定义了空字符串数组,执行函数后输出符合预期:

let setOne = [""];
function checkTheSameBetter(setOne) { 
  let ObjectShop = {}; 
  for (let indexSetOne = 0; indexSetOne < setOne.length; indexSetOne++) { 
    ObjectShop[setOne[indexSetOne]] = true; 
  } 
  console.log(ObjectShop); 
}
checkTheSameBetter(setOne); // 输出 { '': true }

但当你把数组改成["", 1]后,输出顺序就反过来了:

let setOne = ["", 1];
checkTheSameBetter(setOne); // 输出 {'1': true, '': true },而非预期的 {'': true, '1': true}

原因解析

JavaScript普通对象的属性枚举顺序是有明确规则的,不是完全按照你添加属性的顺序来:

  • 第一步:优先枚举所有可被解析为正整数的字符串属性键(比如你的数字1会被自动转为字符串'1',属于这类),这些键会按数值大小从小到大排序;
  • 第二步:再按照属性添加的先后顺序枚举剩下的非正整数字符串键(比如空字符串''就属于这一类);
  • 第三步:最后枚举Symbol类型的属性键(这里没涉及)。

所以在你的例子里,'1'作为正整数属性键会被优先排列,空字符串''则排在后面,这就导致了输出顺序和你预期的不一致。

解决办法:用Map保持插入顺序

如果想要严格保持属性的插入顺序,推荐使用Map来代替普通对象,因为Map会完全按照键的插入顺序来存储和遍历:

function checkTheSameBetter(setOne) { 
  let mapShop = new Map(); 
  for (let indexSetOne = 0; indexSetOne < setOne.length; indexSetOne++) { 
    mapShop.set(setOne[indexSetOne], true); 
  } 
  console.log(mapShop); // 输出 Map(2) { '' => true, 1 => true }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:23:12