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

JavaScript对象使用扩展运算符时,属性顺序的判定规则是什么?

JavaScript扩展运算符中数字键属性的排序疑问

在使用JavaScript扩展运算符时,以下代码的结果对象属性顺序符合预期:

const morning = {
    breakfast: "oatmeal",
    lunch: "Peanut butter and jelly"
}

const dinner = "mac and cheese";

const backPackingMeals = {
    ...morning, 
    dinner
};

console.log(backPackingMeals);

// 输出:
/*{
    breakfast: 'oatmeal',
    lunch: 'Peanut butter and jelly',
    dinner: 'mac and cheese'
  }*/

属性按添加顺序输出。但以下代码的输出顺序不符合预期:

const backPackingMeals = {
    ...morning, 
    ...dinner
};

// 结果:
/*{
  '0': 'm',
  '1': 'a',
  '2': 'c',
  '3': ' ',
  '4': 'a',
  '5': 'n',
  '6': 'd',
  '7': ' ',
  '8': 'c',
  '9': 'h',
  '10': 'e',
  '11': 'e',
  '12': 's',
  '13': 'e',
  breakfast: 'oatmeal',
  lunch: 'Peanut butter and jelly'
}*/

我并非询问为何dinner被拆分为单个字符的属性,而是想知道为何这些数字键属性会排在breakfast和lunch属性之前。


这是因为ECMAScript规范对对象属性的遍历/展示顺序有明确规则:

  • 首先处理整数索引类型的键(即能被解析为正整数的字符串键,比如'0'、'1'、'10'这类),这些键会按数值从小到大排序,放在属性列表最前面;
  • 接着处理非整数索引的字符串键,按照它们被添加到对象中的先后顺序排列;
  • 最后处理Symbol类型的键,同样按插入顺序排列。

在第二个示例里,扩展字符串dinner时,会生成一系列以数字为键的属性('0'对应'm','1'对应'a',以此类推),这些都属于整数索引键,所以会被优先排到前面;而morning中的breakfast、lunch属于非数字的字符串键,只能按插入顺序排在整数索引键之后。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:56:16