Das Ändern einer Kopie eines JavaScript-Objekts führt zu Änderungen am Originalobjekt
P粉765684602
2023-08-27 18:32:45
<p>Ich kopiere <code>objA</code> nach <code>objB</code></p>
<pre class="brush:php;toolbar:false;">const objA = { prop: 1 },
const objB = objA;
objB.prop = 2;
console.log(objA.prop); // protokolliert 2 statt 1</pre>
<p>Arrays haben auch das gleiche Problem</p>
<pre class="brush:php;toolbar:false;">const arrA = [1, 2, 3],
const arrB = arrA;
arrB.push(4);
console.log(arrA.length); // `arrA` hat 4 statt 3 Elemente.</pre>
<p><br /></p>
总而言之,为了澄清起见,有四种复制 JS 对象的方法。
...{}
或Object.assign()
。lodash
这样的实用程序库。Object.create()
确实创建了一个新对象。这些属性在对象之间共享(更改其中一个也会更改另一个)。与普通副本的区别在于,属性被添加到新对象的原型__proto__
下。当您从不更改原始对象时,这也可以用作浅拷贝,但我建议使用上述方法之一,除非您特别需要这种行为。很明显,您对语句
var tempMyObj = myObj;
的作用存在一些误解。在 JavaScript 中,对象是通过引用(更准确地说是引用的值)传递和分配的,因此
tempMyObj
和myObj
都是对同一对象的引用。这是一个简化的插图,可以帮助您直观地了解正在发生的事情
正如您在赋值后所看到的,两个引用都指向同一个对象。
如果您需要修改其中一个而不是另一个,则需要创建副本。
旧答案:
这里有几种创建对象副本的其他方法
由于您已经在使用 jQuery:
使用普通 JavaScript
请参阅此处和此处