Javascript 是否可以在分解另一个对象时(在分解时使用默认值)分配对象

Javascript 是否可以在分解另一个对象时(在分解时使用默认值)分配对象,javascript,json,ecmascript-next,Javascript,Json,Ecmascript Next,我的最终目标是能够在指定默认值(如果默认值不存在)的同时,使用来自对象的来指定新对象 看起来这可能不可能,就像我所希望的那样。以下是我的期望和尝试: //预期的起始对象 常数a1={ 键1:“test1”, 键2:“test2”, }; //预期的最终结果 常数b1={ 键1:“test1”, 键2:“test2”, 关键3:{ nestedKey1:“nestedVal1”, }, }; //预期开始对象 常数a2={ 键1:“test1”, 键2:“test2”, 关键3:{ nestedK

我的最终目标是能够在指定默认值(如果默认值不存在)的同时,使用来自对象的来指定新对象

看起来这可能不可能,就像我所希望的那样。以下是我的期望和尝试:
//预期的起始对象
常数a1={
键1:“test1”,
键2:“test2”,
};
//预期的最终结果
常数b1={
键1:“test1”,
键2:“test2”,
关键3:{
nestedKey1:“nestedVal1”,
},
};
//预期开始对象
常数a2={
键1:“test1”,
键2:“test2”,
关键3:{
nestedKey1:“实际值”,
}
}
//预期的最终结果
常数b2={
键1:“test1”,
键2:“test2”,
关键3:{
nestedKey1:“实际值”,
},

};您的困惑源于解构语法与对象声明语法的相似性

这是对象声明:

const a = {
  key1: "test1",
  key2: "test2",
}
这是解构

const { key1, key2 } = a

console.log(key1)  // => test1
console.log(key2)  // => test2
接下来,您需要记住赋值运算符
=
在JavaScript中是右关联的。大概是

let a = b = 1
表示将值
1
分配给
b
,然后分配给
a

接下来,如果您将所有值分散到一个var中,那么您实际上是在用一种奇特的ES6语法进行一个简单的赋值。因此:

const {...b} = a
// is same as
const b = a
结合上述3种效果,您得到的实际上是一个多重分配:

const {...b} = a  
const {key1, key2} = a
多重分配可能会造成混淆,并且存在防止此类问题的林线规则:

所以你的问题的答案很简单:不


这样做至少需要两行代码——一行用于在分解结构时收集具有默认值的道具,另一行用于使用这些道具创建下一个对象。

很接近,您只需记住,在使用排列运算符时顺序很重要,因为后面的值将覆盖前面的值。尝试类似于
{…a,key3:{nestedKey1:“nestedVal1”,…a.key3,}}
@Hamms我已经更新了第二个代码片段来修复错误。不过,我相信它的功能与预期一样。如果对象-->上已存在值,请不要覆盖该值。如果不存在,请使用默认值(包括嵌套对象值,而不覆盖其他预先存在的键)定义它