変数の配列について

返信する
呶々っち
記事: 4
登録日時: 2024年2月15日(木) 05:43

変数の配列について

投稿記事 by 呶々っち »

お世話になります。

一つ、変数で配列[]を使用する際にどうしてもわからないのですが、
例えば通常の「変数の操作」コマンドで
1~10の変数を指定、代入するものをスクリプトで「[]」とやると
1~10には配列が入りますが、
この後に例えば
$gameVariables._data[1][0]="a"とすると、
1~10まですべての[0]に"a"が入ってしまいます。

この仕組みがよくわからないのですが、
$gameVariables._data[1][0]="a"とすると
1の[0]にだけ"a"が入るようにすることはできないのでしょうか?

そうならないように気を付けて作っていましたが、
なぜかどこかのタイミングで一つを変えると他の変数のものも全て変わってしまう現象が起きてしまいました。
こうなる要因は他になにかありますか?
名無し蛙
記事: 352
登録日時: 2015年11月23日(月) 02:46

Re: 変数の配列について

投稿記事 by 名無し蛙 »

数値や文字列等はプリミティブ型、それに対し配列はオブジェクト型に分類されます。
厳密な挙動に関しては凄くややこしいので詳細は省きますけど
一つの配列をみんなで共有している状態で「オブジェクト型はそういう仕様」としか言えないです。
一応関連資料は貼っておきます。
呶々っち さんが書きました:この仕組みがよくわからないのですが、
$gameVariables._data[1][0]="a"とすると
1の[0]にだけ"a"が入るようにすることはできないのでしょうか?
変数の操作の範囲指定を利用した時点で無理ですね。
普通にfor文等を利用して初期化してください。

コード: 全て選択

for (let i = 1; i <=10; i++) {
    $gameVariables.setValue(i, []);
}
ちなみに範囲指定を簡易コードで再現するとこんな感じになります。
この場合も同じ配列を複数の変数で使い回すバッドパターンですね。

コード: 全て選択

const array = [];
for (let i = 1; i <=10; i++) {
    $gameVariables.setValue(i, array);
}
何気なく使用している[]とはnew Array()と同じ意味なのでそこから違和感を持てば理解し易いかもしれません。

コード: 全て選択

// 上記のコードと同じ
for (let i = 1; i <=10; i++) {
    // ループ回数分newを実行している
    $gameVariables.setValue(i, new Array());
}

// 最初の一回だけnewを実行している
const array = new Array();
for (let i = 1; i <=10; i++) {
    $gameVariables.setValue(i, array);
}
参考資料
【JavaScript】プリミティブ型とオブジェクト型を理解したい
https://qiita.com/ta1fukumoto/items/eff ... 96a2648d41

JavaScriptに参照渡し/値渡しなど存在しない
https://qiita.com/yuta0801/items/f8690a6e129c594de5fb
呶々っち
記事: 4
登録日時: 2024年2月15日(木) 05:43

Re: 変数の配列について

投稿記事 by 呶々っち »

名無し蛙さん

ご丁寧にありがとうございます…!

書いていただいた返信を参考に、どうにかバグ修正ができました。。

しかもスクリプトは始めたばかりだったので、載せていただいた参考資料がためになり、
何回も目を通させていただきました…

お世話になりました :D
返信する

“MZ:質問”に戻る