Javascriptで手軽にdeep copyする
下記のように一度JSON.stringify()でjsonの文字列にしてからJSON.parse()でobjectに戻すと
簡易的にdeep copy、つまりcloneできる。
var clonedList = JSON.parse( JSON.stringify(l) );
実装shallow copyとdeep copyの比較サンプルコード
var list = [0,0,0]; var listForCopy = [0,0,0]; var someStaticClass = { f: function (l, callback) { // some operations .. var shallowCopied = l; setTimeout(function () { shallowCopied.push(shallowCopied.length); callback(shallowCopied); }, 500); }, deepCopy: function (l, callback) { // some operations .. setTimeout(function () { var clonedList = JSON.parse( JSON.stringify(l) ); // deep copy! clonedList.push(clonedList.length); callback(clonedList); }, 1200); } }; someStaticClass.f(list,function(v){ console.log("first f(): \t"+JSON.stringify(v)); // first f(): [0,0,0,3] someStaticClass.f(list,function(v){ console.log("second f(): \t"+JSON.stringify(v)); // second f(): [0,0,0,3,4] console.log("orginal list : \t"+JSON.stringify(list)); // orginal list : [0,0,0,3,4] }); }); someStaticClass.deepCopy(listForCopy,function(v){ console.log("first deepCopy(): \t"+JSON.stringify(v)); // first deepCopy(): [0,0,0,3] someStaticClass.deepCopy(listForCopy,function(v){ console.log("second deepCopy(): \t"+JSON.stringify(v)); // second deepCopy(): [0,0,0,3] console.log("orginal listForCopy : \t"+JSON.stringify(listForCopy)); // orginal listForCopy : [0,0,0] }); });