2016-08-18 7 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にリンクされていると思うかもしれません...だから、ループ関数上では引数copyをvar aの参照として渡しますloopスコープでは、コピーargには新しい参照が割り当てられます。これは、論理が参照を変更すると考えて、var aがその新しい参照に割り当てられるからです。 – Miguel

関連する問題