質問: arr1.push(arr2); console.log("★",superArr);//6 console.log("★2",superArr2);//7 ``` そうすると、なぜか「6」と「7」が返ってきました。しかしこれらがいったいなにを指しているのかが解かりません。 両方とも`push()`を利用しているのでせめて同じ数字が返ってくるのかと思ったのですが、どうも`apply()`という指定したレシーブオブジェクトのthis参照を第一引数の値に、第二引数をその指定したオブジェクトの引数として利用するものを使ったことで変わりました。 これらは、いったい何を意味した数字で、なぜ違う値が返ってきたのでしょうか。 書籍によると`push()`は、**配列が要素として追加されてしまうので注意**と記述してありました。 この記述もよく理解できませんが、要素になるというのは、入れ子になってしまうということですか。
回答: > > しかし誤って、配列の末尾に値を追加するpush()でconcat()のようなことをしてしまいました。 > > > applyを使ってるところとか誤ってやるようなことでは無い気がするのですが、何かを参考にしたのではないのですか? > > そうすると、なぜか「6」と「7」が返ってきました。しかしこれらがいったいなにを指しているのかが解かりません。 > > > 疑問に思うならpushの戻り値の仕様を確認しましょう。 戻り値は「新しい配列の要素数」と書かれています。 Array.prototype.push() - JavaScript | MDN また、applyを使った例も載ってます。 > > どうもapply()という指定したレシーブオブジェクトのthis参照を第一引数の値に、第二引数をその指定したオブジェクトの引数として利用するものを使ったことで変わりました。 > > > applyの第2引数の配列は展開されて渡されます。 Function.prototype.apply() - JavaScript | MDN > > これらは、いったい何を意味した数字で、なぜ違う値が返ってきたのでしょうか。 > > > やってることも違うし、実行時点のarr1の内容も違います。 (`var superArr = Array.prototype.push.apply(arr1,arr2);`を実行した時点でarr1の内容は書き換えられています。) というか、何が起こっているのか知りたいなら、pushの戻り値ではなく配列の中身を見ましょう。 ``` var arr1 = [0,1,2]; var arr2 = [3,4,5]; var superArr = Array.prototype.push.apply(arr1,arr2); //arr1.push(arr2[0],arr2[1],arr2[2]);と等価 console.log(arr1); //Array [ 0, 1, 2, 3, 4, 5 ] var superArr2 = arr1.push(arr2); console.log(arr1); //Array [ 0, 1, 2, 3, 4, 5, Array[3] ] ``` > > 書籍によるとpush()は、配列が要素として追加されてしまうので注意と記述してありました。 > > この記述もよく理解できませんが、要素になるというのは、入れ子になってしまうということですか。 > > > 上に書いたとおり試してみれば分かりますが、入れ子になってます。