我试图将一个对象推入数组。其成功插入数组。 这三个代码有什么区别。
Array.push(Object.assign({}, JSON.parse(JSON.stringify(Object))))
Array.push(Object.assign({},Object))
Array.push(Object)
答案 0 :(得分:4)
首先,如果您重新定义了全局对象,则此代码可能无法运行 -1
是静态方法,但是因为您正在处理{ {1}}作为实际对象(or
的实例),则无法通过该方法进行访问。
仅当您重命名变量(我只是将它们小写)或您意识到将Object.assign
函数推到数组时,代码才起作用。
第一行:
Object
将Object
的深层副本推送到数组。深拷贝意味着没有引用-两者是完全不同的对象。修改原始Object
不会修改array.push(Object.assign({}, JSON.parse(JSON.stringify(object))));
内部的object
的深层副本。函数和方法以及所有object
值都将被剥离。循环引用(例如object
)也会失败(因为您正试图在字符串中放置无数个字符-从来都不是一个好主意
第二行:
array
将undefined
的浅拷贝推送到window.window.window...
。这意味着对象本身的属性将按值复制,而嵌套对象内部的属性将按引用复制。
第三行:
array.push(Object.assign({}, object));
将对object
的引用推入array
中。这意味着如果修改了array.push(object);
,则object
内部的array
也将被修改。
答案 1 :(得分:1)
Array.push(Object.assign({}, JSON.parse(JSON.stringify(Object))))
它有四种不同的东西-
String/searializing
。但是在您的情况下,您可能有一个深层嵌套的object
,这就是为什么将其转换为string/searializing
以完全克隆它的原因,因为objects
是引用变量。stringify
相反,当从Web服务器接收数据时,数据始终为字符串。在使用Object.assign
方法时,您需要将cloned sting object
转换回object
。object
与所有其他empty object - {}
一起复制到own properties/ proto properties
Array.push -最后,您将新鲜的对象推入array
Array.push(Object.assign({},Object))
这里您要将object
的地址复制到新的empty object
,然后将其推送到array
,但这是reference
,因此对{{1}的任何更改object
内的}会更改原始的array
,因为您复制了对象的地址。
object
在这种情况下,您只需将Array.push(Object)
地址直接推到object
,那里的任何更改都会修改原始对象。
答案 2 :(得分:0)
Array.push(Object.assign({}, JSON.parse(JSON.stringify(Object))))
对于以上示例,
-您正在使用JSON.stringify()和
从Object创建字符串-使用JSON.parse()和
从该字符串中创建一个新对象-通过传递新的空对象{}重新使用Object.assign()创建一个新对象。
-在这里,将对象克隆到新对象并将其推入数组。
Array.push(Object.assign({},Object))
对于以上示例,
-您正在通过传递新的空对象{}使用Object.assign()创建新对象。
-在这里将对象克隆到新对象并将其推入数组
Array.push(Object)
对于以上示例,
-您只是将对象推入数组。