物件複製的部分方法

2021-09-26 11:37:02 字數 2350 閱讀 3451

js 物件操作 物件原型操作 把乙個物件a賦值給另乙個物件b 並且物件b 修改 不會影響 a物件

我最近在做乙個vue + element-ui + vue-resource + vuex專案的時候,遇到了乙個物件的問題。

當我們在專案需要 複製乙個物件到另乙個物件並且 被複製的物件不能受複製後的物件的影響。

我先總結下 我們哪些方法可以複製物件

// 直接賦值

var obj1 = ;

var obj2 = obj1;

console.log(obj2); //

// 通過 object.assign() 這個屬性來進行複製

var obj = ;

var obj2 = object.assign({}, obj);

console.log(obj2); //

// 通過 for in 迴圈賦值

var obj1=, c: 0 }

var obj2={}

for( var key in obj1 )

console.log(obj2); // , c: 0 }

以上的方法中 都可以把乙個物件的鍵值賦值給另乙個物件(但是我們可以測試出來obj2修改他的鍵值,obj1的鍵值也會被修改),

這就跟我家的鑰匙剛開始是一把鑰匙,然後我到配鑰匙的地方配了一把一模一樣的鑰匙,那麼我的這把原來的鑰匙可以開我家的門,拿我家的東西,那麼配的那把鑰匙,也可以開啟我家的門,拿走我家的東西。

其實我們想做的是,我們心買了乙個房子,只是房子裡的東西擺設跟我原來的房子是一模一樣的,唯獨不一樣的就是,我原來家的鑰匙只能開原來家的門,新家的鑰匙只能開新家的門,雖然兩個房子裡的東西是一模一樣的,但是都是沒有實際的關聯關係。那麼這樣我門需要怎麼做呢。

我們可以先看看下面的這個方法

// 使用 object.assign() 方法複製物件

let obj1 = };

let obj2 = object.assign({}, obj1);

console.log(json.stringify(obj2)); // }

obj1.a = 1;

console.log(json.stringify(obj1)); // }

console.log(json.stringify(obj2)); // }

obj2.a = 2;

console.log(json.stringify(obj1)); // }

console.log(json.stringify(obj2)); // }

obj2.b.c = 3;

console.log(json.stringify(obj1)); // }

console.log(json.stringify(obj2)); // }

我們可以看到上面 object.assign() 的這個方法雖然可以複製我第一層的物件值,並且當我obj2修改第一層的資料時,obj1不會受到影響。

但是我們在修改obj2 裡 b 物件裡的c的值得時候,這個時候 obj1 裡的 b 物件裡的 c 的值也發生了改變,這就說明了,object.assign()這個方法不是深層的複製物件,只是讓物件裡第一層的資料沒有了關聯性,但是物件內的物件則跟被複製的物件有著關聯性的。那麼我們其實可以想象,怎麼才能讓他們完全沒有關聯性沒呢。

字串型別 和 物件型別 肯定是沒有關聯性的 ,因為它們的型別都不一樣,肯定是沒有可比性和關聯性的。 有了這樣的想法我覺得我們就有辦法決絕這個問題了;

// 這個最簡單暴力的處理 兩個物件的關聯性的問題

obj1 = };

let obj3 = json.parse(json.stringify(obj1));

obj1.a = 4;

obj1.b.c = 4;

console.log(json.stringify(obj3)); // }

上面的**已經可以體現出來我們剛才的乙個假設,我們先把obj1 轉成了字串型別, 這樣他就失去了物件的屬性和一切的特性,然後我們再把它轉成乙個物件型別,這樣我們心生成的物件是通過字串轉換過來的,已經是乙個新的物件,然後再賦值給obj2 ,這樣就相當於,我把我原來家的布置等東西,用設計稿的方式展現出來,然後我們又買了乙個新家,按著原來的設計方式重構了出來,這樣兩個房子的內飾是一模一樣的,但是門的鑰匙不一樣,這樣就失去了以前的關聯性。

以上的方法可以封裝成方法方便使用

var function cloneobjectfn (obj)

var obj1=}

var obj2=cloneobjectfn(obj1)

console.log(obj2) // }

僅供參考

response物件中的部分方法

輸出緩衝區與相應提交 輸出緩衝區用於暫存servlet程式的輸出資訊,減少伺服器與客戶端的通訊次數 傳送給客戶端的資訊稱其為響應資訊,如果輸出緩衝區中的響應資訊已經傳遞給客戶端,稱響應被提交,重新整理操作強制把輸出緩 沖區的內容傳遞給客戶端 flushbuffer 重新整理輸出緩衝區,把資訊傳回客戶...

深複製和淺複製 js物件拷貝的方法

js物件拷貝的方法 物件拷貝的方法是乙個難點,尤其是深拷貝。建議把 都執行下,幫助理解拷貝。1.適合情況 json物件的深度轉殖。方法是先json.stringify 轉為json字串,再json.parse 轉為json陣列 2.缺點 a.如果你的物件裡有函式,函式無法被拷貝下來 b.無法拷貝co...

物件的複製

物件的複製 include box.h include using namespace std int main 這裡首先宣告了乙個物件box1 12,34,56 實引數為12,34,56,然後我再宣告乙個物件box2,並將物件box1賦值給物件 box2,所以box2就獲得box1的同款實參,同理...