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

JavaScript中展开运算符是否支持修改对象属性值?

核心结论

展开运算符本身不具备修改属性值的功能,你观察到的属性覆盖效果是JS对象字面量的默认同名属性覆盖规则带来的,和展开运算符没有直接关系。

代码执行逻辑拆解

你代码if分支里的return语句,本质是创建了一个全新的对象,执行顺序如下:

  1. 先初始化一个空的新对象
  2. 执行...item:将匹配到的item(此时值为{ name: "a" })的所有可枚举属性复制到新对象中,执行完成后新对象的内容为{ name: "a" }
  3. 处理后续写的name属性:这里用了ES6的对象属性简写语法,等价于name: name,也就是把传入的参数name的值"c"赋值给新对象的name属性。JS解析对象字面量时遇到同名属性,会默认用位置更靠后的属性值覆盖前面的,所以这一步新对象的name属性就被更新为"c",最终返回的新对象就是{ name: "c" }。

补充验证

你可以用最简单的对象声明测试这个规则,确实和展开运算符无关:

// 直接声明两个同名属性,靠后的会覆盖前面的
const testObj = { name: "a", name: "c" };
console.log(testObj.name); // 输出 c

这种写法是常用的不可变数据更新方式,不会修改原始的数组和对象,你可以打印原始数组验证:

console.log(abc[0].name); // 还是输出 "a",原始数据没有被改动

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:51:01