Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象使用公共键展开_Javascript_Ecmascript 6 - Fatal编程技术网

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
    部分。