Javascript Object.assign方法将更改原始对象属性-JS
我是ReactJS新手,我发现了一件关于Javascript Object.assign方法将更改原始对象属性-JS,javascript,reactjs,Javascript,Reactjs,我是ReactJS新手,我发现了一件关于Object.assign()的奇怪事情: const B={ k1:‘b’, k2:‘bb’, 特雷达:[{ 儿童:['g'] }] } var A=Object.assign({},B); A.treedata[0]。子对象=[1]; console.log(B)您需要解析和strigify对象,然后使用对象。分配, 像这样var A=Object.assign({},JSON.parse(JSON.stringify(B)),以便原始对象不会更改
Object.assign()的奇怪事情:
const B={
k1:‘b’,
k2:‘bb’,
特雷达:[{
儿童:['g']
}]
}
var A=Object.assign({},B);
A.treedata[0]。子对象=[1];
console.log(B)
您需要解析和strigify对象,然后使用对象。分配,
像这样var A=Object.assign({},JSON.parse(JSON.stringify(B))代码>,以便原始对象不会更改
查看代码片段
const B={
k1:‘b’,
k2:‘bb’,
treedata:[{title:'title',key:-1,fieldName:'',from:-1,to:-1,children:['g']}]
}
var A=Object.assign({},JSON.parse(JSON.stringify(B));
A.treedata[0]。子对象=[1];
警报(B.treedata[0]。儿童)代码>您需要解析和strigify对象,然后使用对象。分配,
像这样var A=Object.assign({},JSON.parse(JSON.stringify(B))代码>,以便原始对象不会更改
查看代码片段
const B={
k1:‘b’,
k2:‘bb’,
treedata:[{title:'title',key:-1,fieldName:'',from:-1,to:-1,children:['g']}]
}
var A=Object.assign({},JSON.parse(JSON.stringify(B));
A.treedata[0]。子对象=[1];
警报(B.treedata[0]。儿童)代码>与ReactJS无关,这是JavaScript的工作方式(以及Ruby和Python…)。我明白了,我正在进行react实践,很抱歉标记。Object.assign
仅将属性复制到新对象中。如果一个属性是对另一个对象的引用,比如在你的例子中treedata
is,那么object.assign
复制一个引用,因此对象a和B指向同一个treedata
。你也可以在这里阅读以明确对象。assign()这个问题的解释和答案在这里提到:-在标题下“深度克隆警告”与ReactJS无关,JavaScript就是这样工作的(还有Ruby和Python…)。我明白了,我正在做一个react练习,为标记感到抱歉。Object.assign
只将属性复制到一个新对象中。如果一个属性是对另一个对象的引用,就像您的例子中的treedata
is,那么对象。assign
复制一个引用,因此对象a和B指向相同的treedata
。您可以在这里阅读因此,为了明确Object.assign()这个问题的解释和答案,这里提到:-在标题“深度克隆警告”下,谢谢Aravind!这非常有帮助。@charleschen随时准备提供帮助“需要解析和字符串化”-不,你只需要深度复制。“解析和字符串化”是一种方法(考虑到它的局限性,这不是最好的)。请参考。@Amadan您能描述一下深度复制吗?我真的想知道简单的解决方案。没有简单的解决方案,因为JavaScript中没有本机深度复制。JSON路由的问题是它不能复制循环结构,也不能复制任何非JSON基元的内容。我已经将规范堆栈溢出链接到w线程处理JavaScript中的深度复制。(另请参阅以了解问题。)感谢Aravind!这非常有帮助。@charleschen随时准备提供帮助“需要解析和字符串化”-不,您只需要进行深度复制。“解析和字符串化”是一种方法(鉴于其局限性,不是最好的方法)。请参考。@Amadan您能描述一下深度复制吗?我真的想知道简单的解决方案。没有简单的解决方案,因为JavaScript中没有本机深度复制。JSON路由的问题是它不能复制循环结构,也不能复制任何非JSON基元的内容。我已经将规范堆栈溢出链接到在JavaScript中处理深度复制的w线程(另请参阅以了解问题)