一、現象:直接用=的方式把一個對象賦值給另一個對象,會導致修改新對象時,原對象也發生變化
var obj1 = {"name": "1111"}; var obj2 = obj1; obj2.name = "2222"; console.log(obj1.name); //"2222"二、原因:JavaScript 中對象的賦值是默認引用賦值的(兩個對象指向相同的內存地址) 三、解決方法: JSON.parse(JSON.stringify(obj))
通過 Object.assign() 賦值
// 使用 Object.assign() 方法復制對象 let obj1 = { a: 0 , b: { c: 0}}; let obj2 = Object.assign({}, obj1); console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}} obj2.a = 2; console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}} console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 0}} obj2.b.c = 3; console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}} console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}}
此方法也有不足之處:當修改obj2.b.c的值時,原對象obj1.b.c也跟著發生了變化,Object.assign()只是讓對象里第一層的數據沒有了關聯性,但是對象內的對象則跟被復制的對象有著關聯性的。
終極解決方案:JSON.parse(JSON.stringify(obj))
var function cloneObjectFn (obj){ // 對象復制 return JSON.parse(JSON.stringify(obj)) } var obj1={a:2,b{c:0}} var obj2=cloneObjectFn(obj1) console.log(obj2) // {a:2,b{c:0}}
更多詳細內容請參考:https://www.cnblogs.com/c2016...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/102268.html
摘要:它將返回目標對象。有些文章說是深拷貝,其實這是不正確的。深拷貝相比于淺拷貝速度較慢并且花銷較大。拷貝前后兩個對象互不影響。使用深拷貝的場景完全改變變量之后對沒有任何影響,這就是深拷貝的魔力。 一、賦值(Copy) 賦值是將某一數值或對象賦給某個變量的過程,分為: 1、基本數據類型:賦值,賦值之后兩個變量互不影響 2、引用數據類型:賦址,兩個變量具有相同的引用,指向同一個對象,相互之間有...
摘要:淺拷貝是按位拷貝對象,它會創建一個新對象,這個對象有著原始對象屬性值的一份精確拷貝。兩個對象引用都引用了同一個對象。對于字符串數字及布爾值來說不是或者對象,會拷貝這些值到新的數組里。 1、對象的理解 對象是一個包含相關數據和方法的集合(通常由一些變量和函數組成,我們稱之為對象里面的屬性和方法) 1.1 對象可以看成是Object對象構造出來的 showImg(https://user...
摘要:展開語法木易楊通過代碼可以看出實際效果和是一樣的。木易楊可以看出,改變之后的值并沒有發生變化,但改變之后,相應的的值也發生變化。深拷貝使用場景木易楊完全改變變量之后對沒有任何影響,這就是深拷貝的魔力。木易楊情況下,轉換結果不正確。 一、賦值(Copy) 賦值是將某一數值或對象賦給某個變量的過程,分為下面 2 部分 基本數據類型:賦值,賦值之后兩個變量互不影響 引用數據類型:賦址,兩個...
閱讀 2394·2021-10-09 09:41
閱讀 3192·2021-09-26 09:46
閱讀 842·2021-09-03 10:34
閱讀 3173·2021-08-11 11:22
閱讀 3378·2019-08-30 14:12
閱讀 720·2019-08-26 11:34
閱讀 3352·2019-08-26 11:00
閱讀 1781·2019-08-26 10:26