Javascript Object.assign在一种情况下创建深拷贝,但在另一种情况下仅创建浅拷贝

Javascript Object.assign在一种情况下创建深拷贝,但在另一种情况下仅创建浅拷贝,javascript,Javascript,因此,我知道,Object.assign只生成对象的浅拷贝。但是为什么在第二个console.log()中,它会给我一个与新对象合并的完整深度副本呢 我不明白 const initialState1={ 启动:{ 项目:[], 位置:{}, crType:[ { 其他信息:{ 空白CD:90 }, 要求:{ 项目:[ { 计数:0 }, {} ] } }, {}, {} ], toggleDispatch:()=>{}, showSelector:false, } } 常量showPopup=

因此,我知道,
Object.assign
只生成对象的浅拷贝。但是为什么在第二个
console.log()
中,它会给我一个与新对象合并的完整深度副本呢

我不明白

const initialState1={
启动:{
项目:[],
位置:{},
crType:[
{
其他信息:{
空白CD:90
},
要求:{
项目:[
{
计数:0
},
{}
]
}
},
{},
{}
],
toggleDispatch:()=>{},
showSelector:false,
}
}
常量showPopup={
启动:{
showSelector:true
}
}
console.log(Object.assign(initialState1,showPopup))
常量initialState2={
回调:()=>{},
itemId:0,
lastSubID:0,
关闭:()=>{},
电流:0,
声明:'',
isShopComplete:错误,
要求:{
最低级别:{
可用:false
}
}
}
常数教育={
要求:{
最低级别:{
可用:真
}
}
}

console.log(Object.assign(initialState2,educ))
在这两种情况下,它都在创建浅层副本。您需要了解,浅复制并不意味着对象深度为1,而是键值对包含对同一对象的引用,而不是副本

也就是说,如果更改内部对象的特性,它将反映在原始对象中。在第一种情况下,如果更改
object.assign
方法返回的对象的
showSelector
属性,它将反映在
showPopup
对象上。这就是浅拷贝的意思


同样在第二种情况下,如果更改
requirements.minLevel
属性,它将反映在
educ
对象上。

在这两种情况下,它都是在创建浅层副本。您需要了解,浅复制并不意味着对象深度为1,而是键值对包含对同一对象的引用,而不是副本

也就是说,如果更改内部对象的特性,它将反映在原始对象中。在第一种情况下,如果更改
object.assign
方法返回的对象的
showSelector
属性,它将反映在
showPopup
对象上。这就是浅拷贝的意思


同样在第二种情况下,如果更改
requirements.minLevel
属性,它将反映在
educ
对象上。

在这两种情况下,后一个对象中的顶级属性被指定给前一个对象中的相同属性。即:

Object.assign({ foo: 'bar' }, { foo: 'baz' })
这最终成为
{foo:'baz'}
,因为来自第二个对象的键
foo
的值被分配给第一个对象的属性
foo

{                   {
  foo: 'bar'  <---    foo: 'baz'
}                   }

只有一个顶级属性被覆盖,但有更多的属性在第二个对象中没有对等的属性,并且它们保持原样。

在这两种情况下,后一个对象中的顶级属性都被指定给前一个对象中的同一属性。即:

Object.assign({ foo: 'bar' }, { foo: 'baz' })
这最终成为
{foo:'baz'}
,因为来自第二个对象的键
foo
的值被分配给第一个对象的属性
foo

{                   {
  foo: 'bar'  <---    foo: 'baz'
}                   }

只有一个顶级属性被覆盖,但有更多的属性在第二个对象中没有对等的属性,它们保持原样。

它不会截断对象深度。只是复印件很浅。也就是说,嵌套对象没有被复制,仍然引用原始对象。这无助于我理解@decezeRead,你的答案是我不确定你期望的是什么。它不会合并任何内容。它用第二个对象的值替换第一个对象的
requirements
属性。它可能显示为“合并”,但这只是因为这两个
要求
除了
/
值之外是相同的。但它还没有被合并,它已经被完全替换了。@deceze
合并了
替换了
-在这种情况下对我来说是一样的。我的意思是,在第二个console.log中,我的对象不会完全相互替换,而只是用dublicate
键替换道具
insteadIt不会截断对象深度。只是复印件很浅。也就是说,嵌套对象没有被复制,仍然引用原始对象。这无助于我理解@decezeRead,你的答案是我不确定你期望的是什么。它不会合并任何内容。它用第二个对象的值替换第一个对象的
requirements
属性。它可能显示为“合并”,但这只是因为这两个
要求
除了
/
值之外是相同的。但它还没有被合并,它已经被完全替换了。@deceze
合并了
替换了
-在这种情况下对我来说是一样的。我的意思是,在第二个console.log中,我的对象并没有完全相互替换,而只是用dublicate
键替换道具,而不是在那里运行我的代码吗?你看到了什么?在第一种情况下,
初始状态
被第二个对象完全替换。但在第二种情况下,
initialState
仅“升级”(替换)duplicated key值。那就是我不能understand@MaxTravis这就是
Object.assign()
所做的;这就是重点。它将属性从源对象复制到目标对象。如果属性名称不是源对象的键,则不会影响目标对象的任何属性。@MaxTravis在第一个示例中,目标对象只有一个属性(“boot”)。是否在那里运行了我的代码?你看到了什么?在第一种情况下,
初始状态
被第二个对象完全替换。但在第二种情况下,
initialState
仅“升级”(替换)duplicated key值。那就是我不能