concatとpush.applyの挙動の違い
javascriptで配列を連結するときによく使う「concat」と「push.apply」。
この2つは微妙に挙動が違うので注意。
例えば以下のコードを実行すると「test1」の値はそのままで「test2」のみに連結された結果が格納される。
var test1 = new Array("1", "2"); var test2 = test1; var add = new Array("3", "4"); //concatで連結 test2 = test2.concat(add); console.log(test1); //("1","2") console.log(test2); //("1","2","3","4")
concatは実行されたときに新たな領域を生成してそこに値をコピーし、その新たな領域を返却する、という動作をするからだ。
以下のようにpush.applyを使ったときは「test1」にも「test2」にも連結された結果が格納される。
var test1 = new Array("1", "2"); var test2 = test1; var add = new Array("3", "4"); //push.applyで連結 Array.prototype.push.apply(test2, add); console.log(test1); //("1","2","3","4") console.log(test2); //("1","2","3","4")
test2はtest1の領域をポイントしていて、test2に対する操作はtest1への操作を意味するからだ。
C言語とかをやってる人だったらポインタの概念を知ってるので、上の挙動はよく理解できると思う。