Javascript 对象使用公共键展开
考虑这一点:Javascript 对象使用公共键展开,javascript,ecmascript-6,Javascript,Ecmascript 6,考虑这一点: let obj1 = {id: 1, common_key: "one", property1: "property_one"} let obj2 = {id: 1, common_key: "two", property2: "property_two'"} let merged = {...obj1, ...obj2} console.log(merged) 输出: {id: 1, common
let obj1 = {id: 1, common_key: "one", property1: "property_one"}
let obj2 = {id: 1, common_key: "two", property2: "property_two'"}
let merged = {...obj1, ...obj2}
console.log(merged)
输出:
{id: 1, common_key: "two", property1: "property_one", property2: "property_two'"}
我们看到obj2
中的common\u键在该合并中被接管(值-“两个”
)。
这是否意味着当对象扩展(合并)中的公共密钥发生冲突时,可以保证后面的一个密钥获胜?如果是,这是否在ES6规范中提及?签出
如果您有公共属性,则优先级将从右向左。最右边的对象优先于左边的对象。是。您将始终获得后续对象的属性
它没有直接提到MDN上的这一点,但spread操作符应用了浅层比较,并将后续属性指定给对象
您可以使用spread操作符以这种方式创建不可变对象
让obj={1:1,2:2,3:3}
设_obj={…obj,三:4};
控制台日志(_obj)代码>您可以在MDN文档中查看此部分
ECMAScript提案的Rest/Spread属性(ES2018)将Spread属性添加到对象文本中。它将自己的可枚举属性从提供的对象复制到新对象上
现在可以使用比Object.assign()更短的语法进行对象的浅层克隆(不包括原型)或合并
constobj1={foo:'bar',x:42};
常量obj2={foo:'baz',y:13};
const mergedObj={…obj1,…obj2};
//对象{foo:“baz”,x:42,y:13}
(不包括设定者)
规范说明了Object.assign(target,…sources)
如何操作:
对于sources
的每个元素nextSource
,按索引升序执行以下操作
其中,它基本上对升序中的每个源执行forEach
循环将的每个OwnProperty键设置为目标对象(到)
MDN在以下内容中也提到了这一点:
这些特性将被以后按参数顺序具有相同特性的其他对象覆盖
这只是顺序,以及ID不会重复的事实。该逻辑将第一个对象的所有键值添加到新对象,然后对第二个对象执行相同的操作。由于键是不重复的,所以它们会替换任何预先存在的东西。就像编写var x={'a':1,'a':2}
一样。最后的x.a
值将是2如果这是对象的行为,我不会感到惊讶,如果基本对象的规范中没有提到它。最后的覆盖获胜。这是大多数编程语言的基本策略。您需要展开属性定义:…AssignmentExpression
部分。