对象数组之间的差异

时间:2019-06-19 06:19:16

标签: javascript arrays node.js object

我试图将一个对象推入数组。其成功插入数组。 这三个代码有什么区别。

Array.push(Object.assign({}, JSON.parse(JSON.stringify(Object))))
Array.push(Object.assign({},Object))
Array.push(Object)

3 个答案:

答案 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))))

它有四种不同的东西-

  1. JSON.stringify -将数据发送到Web服务器时,数据必须为字符串。因此,您基本上将对象转换为String/searializing。但是在您的情况下,您可能有一个深层嵌套的object,这就是为什么将其转换为string/searializing以完全克隆它的原因,因为objects是引用变量。
  2. JSON.parse -与stringify相反,当从Web服务器接收数据时,数据始终为字符串。在使用Object.assign方法时,您需要将cloned sting object转换回object
  3. Object.assign -方法用于将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。在这里,您将复制的object与所有其他empty object - {}一起复制到own properties/ proto properties
  4. 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)

对于以上示例,

-您只是将对象推入数组。