JavaScript中展开运算符是否支持修改对象属性值?
核心结论
展开运算符本身不具备修改属性值的功能,你观察到的属性覆盖效果是JS对象字面量的默认同名属性覆盖规则带来的,和展开运算符没有直接关系。
代码执行逻辑拆解
你代码if分支里的return语句,本质是创建了一个全新的对象,执行顺序如下:
- 先初始化一个空的新对象
- 执行
...item:将匹配到的item(此时值为{ name: "a" })的所有可枚举属性复制到新对象中,执行完成后新对象的内容为{ name: "a" } - 处理后续写的
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
相关产品推荐
相关产品推荐

