2016-08-18 50 views
0

我正在用jQuery測試深層複製,並且我得到了一個空對象,而不是正確的副本。jQuery.extend()深層複製不能按我的預期工作?

但函數loop2做了預期的副本(作爲參考傳遞)。

但是不會loop也獲得擴展/合併對象的引用嗎?

爲什麼它不傳遞正確?

var obj1 = { hello: { f: 1 } }; 
var obj2 = {}; 

function loop(original, copy) { 
    copy = $.extend(true, {}, original); 
    console.log(copy); 
} 

function loop2(original, copy) { 
    $.extend(true, copy, original); 
    console.log(copy); 
} 

function run() { 
    loop(obj1, obj2); 
    console.log(obj2); 

    loop2(obj1, obj2); 
    console.log(obj2); 
} 

輸出:

Object {hello: Object} 
Object {} ---> why this one did not get the correct content? 
Object {hello: Object} 
Object {hello: Object} 

回答

0

這是因爲在循環功能要創建新的對象和內部功能範圍將其分配給本地變量。全局變量和與其關聯的對象不會被修改。這種行爲沒有連接到jQuery.extend(),沒有它將工作相同:

var obj2 = {}; 

function loop(copy) { 
    copy = 'a'; //new value assigned, not its reference 
    console.log(copy); //a 
} 

loop(obj2); 
console.log('->', obj2); //{} 
//it is OK. Its reference was not touched 

function loop2(copy) { 
    copy.a = 'a'; //added a new property to its reference 
    console.log(copy); //{ a: 'a' } 
} 

loop2(obj2); 
console.log('->', obj2); //{ a: 'a' } 
//it is OK. Its reference was touched 
+0

我明白了。但它很奇怪。由於如何創建變量名稱和其引用之間的鏈接?我可以認爲,如果var a = {test:1},那麼事物「var a」將被鏈接到引用xyz ...因此,當我在循環函數中傳遞參數副本作爲var a的引用時,無論如何在循環範圍內,副本arg被分配了一個新的引用,因爲邏輯會認爲它會改變引用,現在var a被分配給新的引用 – Miguel