プロジェクトで若手のコードを見ていたり、若手からの質問を見ていたりすると意外と多いのが値渡し・参照渡しに関する問題でした。
Q:「リストの中のn番目に格納した配列のm番目を更新したいのに、リストの中のすべての配列が更新されてしまう」
こういった質問が特に多い印象を受けました。
配列は参照渡しとして扱われるため、リストへの格納方法を間違えると上記のような問題が発生します。
上のような問題を抱えている若手の実装は以下のようになっていました。(言語はTypeScript)
const array = {~}
for (let i = 0; i < max; i++) {
list.push(array)
}
arrayは1度しか宣言されていない、つまりはメモリとしての参照先は1つしかないため、
この状態でlistの中のarrayを1つ取り出して更新したとしても、listの中のarrayはすべて同じメモリを参照しているため、
すべての配列が更新されているように見えます。
for (let i = 0; i < max; i++) {
const array = {~}
list.push(array)
}
このように使用すれば問題は解消します。
たまーにやらかすので、自戒の意味も含めて投稿しました。