やったこと

webサービスを作るときに考えたことを垂れ流します

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言語とかをやってる人だったらポインタの概念を知ってるので、上の挙動はよく理解できると思う。