修改 JavaScript 物件的副本會導致原始物件發生更改
P粉765684602
2023-08-27 18:32:45
<p>我正在將 <code>objA</code> 複製到 <code>objB</code></p>
<pre class="brush:php;toolbar:false;">const objA = { prop: 1 },
const objB = objA;
objB.prop = 2;
console.log(objA.prop); // logs 2 instead of 1</pre>
<p>陣列也有相同的問題</p>
<pre class="brush:php;toolbar:false;">const arrA = [1, 2, 3],
const arrB = arrA;
arrB.push(4);
console.log(arrA.length); // `arrA` has 4 elements instead of 3.</pre>
<p><br /></p>
總而言之,為了澄清起見,有四種複製 JS 物件的方法。
...{}
或Object.assign()
。lodash
這樣的實用程式庫。Object.create()
確實建立了一個新物件。這些屬性在物件之間共用(更改其中一個也會更改另一個)。與普通副本的區別在於,屬性被加入到新物件的原型__proto__
下。當您從不更改原始物件時,這也可以用作淺拷貝,但我建議使用上述方法之一,除非您特別需要這種行為。很明顯,您對語句
var tempMyObj = myObj;
的作用有些誤解。在 JavaScript 中,物件是透過引用(更準確地說是引用的值)傳遞和分配的,因此
tempMyObj
和myObj
都是對相同物件的參考。這是一個簡化的插圖,可以幫助您直觀地了解正在發生的事情
正如您在賦值後所看到的,兩個引用都指向同一個物件。
如果您需要修改其中一個而不是另一個,則需要建立副本。
舊答案:
#這裡有幾種建立物件副本的其他方法
由於您已經在使用 jQuery:
使用普通 JavaScript
請參閱此處和此處
#