お世話になります。
一つ、変数で配列[]を使用する際にどうしてもわからないのですが、
例えば通常の「変数の操作」コマンドで
1~10の変数を指定、代入するものをスクリプトで「[]」とやると
1~10には配列が入りますが、
この後に例えば
$gameVariables._data[1][0]="a"とすると、
1~10まですべての[0]に"a"が入ってしまいます。
この仕組みがよくわからないのですが、
$gameVariables._data[1][0]="a"とすると
1の[0]にだけ"a"が入るようにすることはできないのでしょうか?
そうならないように気を付けて作っていましたが、
なぜかどこかのタイミングで一つを変えると他の変数のものも全て変わってしまう現象が起きてしまいました。
こうなる要因は他になにかありますか?
変数の配列について
Re: 変数の配列について
数値や文字列等はプリミティブ型、それに対し配列はオブジェクト型に分類されます。
厳密な挙動に関しては凄くややこしいので詳細は省きますけど
一つの配列をみんなで共有している状態で「オブジェクト型はそういう仕様」としか言えないです。
一応関連資料は貼っておきます。
普通にfor文等を利用して初期化してください。
ちなみに範囲指定を簡易コードで再現するとこんな感じになります。
この場合も同じ配列を複数の変数で使い回すバッドパターンですね。
何気なく使用している[]とはnew Array()と同じ意味なのでそこから違和感を持てば理解し易いかもしれません。
参考資料
【JavaScript】プリミティブ型とオブジェクト型を理解したい
https://qiita.com/ta1fukumoto/items/eff ... 96a2648d41
JavaScriptに参照渡し/値渡しなど存在しない
https://qiita.com/yuta0801/items/f8690a6e129c594de5fb
厳密な挙動に関しては凄くややこしいので詳細は省きますけど
一つの配列をみんなで共有している状態で「オブジェクト型はそういう仕様」としか言えないです。
一応関連資料は貼っておきます。
変数の操作の範囲指定を利用した時点で無理ですね。呶々っち さんが書きました:この仕組みがよくわからないのですが、
$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);
}
コード: 全て選択
// 上記のコードと同じ
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
Re: 変数の配列について
名無し蛙さん
ご丁寧にありがとうございます…!
書いていただいた返信を参考に、どうにかバグ修正ができました。。
しかもスクリプトは始めたばかりだったので、載せていただいた参考資料がためになり、
何回も目を通させていただきました…
お世話になりました
ご丁寧にありがとうございます…!
書いていただいた返信を参考に、どうにかバグ修正ができました。。
しかもスクリプトは始めたばかりだったので、載せていただいた参考資料がためになり、
何回も目を通させていただきました…
お世話になりました
