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