2013-08-21 18 views
129

我寫了一個快速jsfiddle here,我將一個小json對象傳遞給一個新變量,並修改原始變量(不是新變量)中的數據,但新變量的數據也被更新。這意味着json對象是通過引用傳遞的,對吧?如何通過引用將JavaScript對象複製到新變量中?

這裏是我的簡單的代碼:

var json_original = {one:'one', two:'two'} 

var json_new = json_original; 

console.log(json_original); //one, two 
console.log(json_new); //one, two 

json_original.one = 'two'; 
json_original.two = 'one'; 

console.log(json_original); //two, one 
console.log(json_new); //two, one 

有沒有一種方法,使一個JSON對象的深層副本,以便修改原始變量不會修改新的變量?

+22

那裏沒有JSON。請不要將JavaScript對象與JSON混淆。 – Quentin

+0

@Quentin,謝謝我將閱讀javacript對象和json之間的區別(參考:http://stackoverflow.com/questions/6489783/whats-the-difference-between-javascript-object-and-json-object ) – Prusprus

+0

不要認爲它是重複的,在其他線程上找不到答案。 – Prusprus

回答

194

我發現以下工作,如果你不使用jQuery和只有克隆簡單對象(見評論)感興趣。

JSON.parse(JSON.stringify(json_original)); 
+14

不適用於函數,僅適用於對象內的屬性(變量) 。 – Harold

+5

'JSON.stringify({key:undefined})// =>「{}」' –

+0

在使用'jQuery.extend'出色的技術出現問題後,這對我來說是奇蹟。 – Kiee

89

你唯一的選擇是以某種方式克隆對象。

請參閱this stackoverflow question關於如何實現此目的。

對於簡單的JSON對象,最簡單的方法是:

var newObject = JSON.parse(JSON.stringify(oldObject)); 

,如果你使用jQuery,您可以使用:

// Shallow copy 
var newObject = jQuery.extend({}, oldObject); 

// Deep copy 
var newObject = jQuery.extend(true, {}, oldObject); 

UPDATE 2017年:我要提,因爲這是一個受歡迎回答,現在有更好的方法來實現這個使用更新版本的javascript:

在ES6或TypeScript(2.1+)中:

var shallowCopy = { ...oldObject }; 

var shallowCopyWithExtraProp = { ...oldObject, extraProp: "abc" }; 

請注意,如果「extraProp」也是oldObject上的一個屬性,則不會使用它的值,因爲extraProp:「abc」會在表達式中稍後指定,這基本上會覆蓋它。當然,oldObject不會被修改。

相關問題