Javascript 如何将对象推入数组而不通过引用传递该对象?

Javascript 如何将对象推入数组而不通过引用传递该对象?,javascript,ecmascript-6,Javascript,Ecmascript 6,所以我在一个名为“tiles”的类中有一个属性,它包含关于跳棋棋盘游戏状态的信息。每次我进行合法移动时,以及在游戏开始时,我都试图将此属性推送到一个名为“移动”的数组中。但问题是,每次我推送new tiles属性时,moves数组中以前的元素都会更改为最新推送的tiles的值 我理解之所以会发生这种情况,是因为对象是通过引用传递的,因此会替换数组中的旧元素,因为它们现在指向同一个对象,这是属性平铺的最新值。因此,根据下面给出的代码,是否有一种方法可以推送此对象,而不是通过引用,而是通过合法移动导

所以我在一个名为“tiles”的类中有一个属性,它包含关于跳棋棋盘游戏状态的信息。每次我进行合法移动时,以及在游戏开始时,我都试图将此属性推送到一个名为“移动”的数组中。但问题是,每次我推送new tiles属性时,moves数组中以前的元素都会更改为最新推送的tiles的值

我理解之所以会发生这种情况,是因为对象是通过引用传递的,因此会替换数组中的旧元素,因为它们现在指向同一个对象,这是属性平铺的最新值。因此,根据下面给出的代码,是否有一种方法可以推送此对象,而不是通过引用,而是通过合法移动导致的每个不同的“瓷砖”状态

以下是我的代码片段:App.js

App = function () {
  var self = this;
  self.tiles = []; 
  // this is populated with objects from a json file
  //code to fetch json and save it to self.tiles
  //more code

  this.startGame = function () {
    //other code
    self.moves.push(self.tiles);
  };
  this.makeMove = function () {
    //other code
    self.moves.push(self.tiles);
  };
};
所以我希望在self.moves数组中,平铺应该指向不同的对象,而不是同一个对象。它应该包含self.tiles的不同状态,但是现在,当我推送属性时,“moves”数组的元素被最新的self.tiles值覆盖


我们将非常感谢您对解决此问题的任何帮助。谢谢

应该使用
JSON.parse(JSON.stringify())
克隆嵌套对象。可以使用
object.assign
克隆浅层对象

App = function () {
  var self = this;
  self.tiles = []; 
  // this is populated with objects from a json file
  //code to fetch json and save it to self.tiles
  //more code

  this.startGame = function () {
    //other code
    self.moves.push(JSON.parse(JSON.stringify(self.tiles)));
  };
  this.makeMove = function () {
    //other code
    self.moves.push(JSON.parse(JSON.stringify(self.tiles)));
  };
};

解决问题的唯一方法是将要推入的对象的克隆传递到向量中。在这种情况下,您通常会向对象编写一个clone()方法,该方法返回自身的深度副本。此方法返回的对象可以推送到数组中。

我对它进行了一些修改,发现可以像这样使用spread操作符:

var a = {b: 1, c: 2}
var array1 = []

array1.push({...a})
a.c=3

console.log(array1) // [0: {b: 1, c: 2}]
console.log(a) // {b: 1, c: 3}

平铺类是否实现了.clone()模式?如果是,使用self.moves.push(self.tiles.clone())我想是的,因为在回调中我有以下代码。self.tiles=wade.cloneObject(data.data.tiles);嘿,Erch,很抱歉,我没有实现.clone()模式,对ES6游戏引擎附带的cloneObject函数感到困惑。但是马希尔的回答起了作用。。。不过还是要谢谢你!“对象是通过引用传递的”假设这是一个常见的错误,但JavaScript是一种通过值传递的语言。对象是引用类型的值,但这与通过引用不同。感谢您的更正Felix。超级感谢Maheer!让它像预期的那样工作。谢谢你!这只是一个浅拷贝(类似于原型,但不包括原型)。如果
a
{level1:{level2:2}}
并且您将执行
({…a})。level1.level2=8
,那么您将变异
a
值。那么您的意思是“克隆”对象的道具实际上是对a.prop1、a.prop2的引用?蒂尔汉克斯·拉维也会注意到这一点。