『JavaScriptパターン ―優れたアプリケーションのための作法』の139ページに、深いコピーをするextend()関数がありますが、以下のコードのchild[i]の挙動はどうなっているのでしょうか?
JavaScript
1function extendDeep(parent, child) { 2 var i, 3 toStr = Object.prototype.toString, 4 astr = "[object Array]"; 5 child = child || {}; 6 7 for (i in parent) { 8 if (parent.hasOwnProperty(i)) { 9 if (typeof parent[i] === "object") { 10 child[i] = (toStr.call(parent[i]) === astr) ? []:{}; 11 extendDeep(parent[i], child[i]); 12 } else { 13 child[i] = parent[i]; 14 } 15 } 16 } 17 return child; 18} 19 20var dad = { 21 counts: [1,2,3], 22 reads: {paper: true} 23}; 24var kid = extendDeep(dad); 25 26kid.counts.push(4); 27console.log(kid.counts.toString()); // 1,2,3,4 28console.log(dad.counts.toString()) // 1,2,3
child[i] = (toStr.call(parent[i]) === astr) ? []:{};
のところのchild[i]のiはcountsになっていますが、何でcounts = []にならないで、childが丸ごと[]に置き換わる挙動になってるんでしょうか?
例えば、以下のような挙動にならないのは、何ででしょうか?
JavaScript
1let child = {}; 2let counts = [1,2,3]; 3 4child[counts] = []; 5console.log(child); // Object { "1,2,3": [] }
回答1件
あなたの回答
tips
プレビュー