2017-01-11 4 views
1

私はプログラミングとjavascriptを使い慣れておらず、インデックスを通じて私の配列の値を変更する際に問題があります。コードの残りの部分は正常に動作しますが、別の配列ではうまくいきますが、インデックスを使って自分の顔にアクセスできないようです。配列の値を変更できません

f1 = 0; 
f2 = 0; 
f3 = 0; 
f4 = 0; 
f5 = 0; 
f6 = 0; 
faces = [f1, f2, f3, f4, f5, f6]; 

//loop through a single throw with 5 dies 
for(var i = 0; i < dice.length; i++){ 
    var die = Math.floor(Math.random() * 6) + 1; 

    //if hold is true skip the corresponding iteration 
    if(hold1 == true && i===0){ 
     alert("holding: " + held[0]);//shows the value of the die that's being held 
     for(var i = 0; i < 6; i++){ 
      faces[i] = 5;//doesn't add anything 
      faces[2] = 5; //nor does this 
      faces[1]++; //or this 
      f1 = 3; //this works however 
     } 
     alert("faces are: " + f1 + ", " + f2 + ", " + f3 + ", " + f4 + ", " + f5 + ", " + f6); 
     continue; 
    } 
//rest of code 

警告は値が変化し、インデックスのみの変数に代入すると、直接動作するようですので、それが3、0、0、0、0、0を返すかどうかを確認することです。

+0

:この質問を参照してください? –

+2

あなたの内側のループは、外側のループと同じ "i"変数を使うべきではありません。変数名を変更します。また、内部の状態、あなたはそれが正しいと確信していますか? 'hold1 == true && i == 0'は間違っているようです。 –

答えて

1

彼らは、単純なデータ型(int型)ですとあなたがfxの値を変更しないでください、彼らはcalled by valueです。シンプルタイプはオブジェクトではなく、called by referenceとすることができます。直接配列を使用しない理由Is JavaScript a pass-by-reference or pass-by-value language?

f1 = 0; 
 
f2 = 0; 
 
f3 = 0; 
 
f4 = 0; 
 
f5 = 0; 
 
f6 = 0; 
 
faces = [f1, f2, f3, f4, f5, f6]; 
 

 
for(var i = 0; i < 6; i++){ 
 
    faces[i] = faces[i] + 5;//doesn't add anything 
 
    faces[2] = faces[2] + 5; //nor does this 
 
    faces[1] = faces[1]++; //or this 
 
    f1 = 3; //this works however 
 
} 
 
console.log("faces are: " + f1 + ", " + f2 + ", " + f3 + ", " + f4 + ", " + f5 + ", " + f6); 
 
console.log("faces are:" , faces);

+0

@GomuGomuあなたが 'faces [1] = 'で設定したときに、fという名前の変数への参照が失われています。これは、インデックスされたアイテムがもはや 'f1'を指していないことを意味します。 – jusopi

0

var hoistingのセクションを参照してください。内側のループと外側のループでvar iを使用しています。それを変更し、それが流れを助けるかどうかを見ます。またlet代わりのvarを使用可能な場合は、ECMA 6.あなたのコードを使用して、配列インデックスでfacesを更新するときに変数が更新されることを期待しているように見えます

2

を使用している場合、私はお勧めしますが、faces[1] = 5は値を代入5最初にf1からコピーされた値(0)を置き換えて、faces[1]に変換します。これは

+1

配列の初期化中に 'f1'からコピーした値(0)を置き換えるのはどうですか? – traktor53

+0

ありがとう@ Traktor53、それは私のところでは誤りでした。これは今修正されました。 –

0

@StephenQuanが指摘するように、あなたは内側のループに異なるインデックス変数を使用する必要があり、また

alert("faces are: " + faces.join(',')); 

:インデックスのみを使用して、もう一度お試しくださいが、今回はにアラートを変更オブジェクトへの参照を配列に渡しています。最初に配列を初期化するときに使用します。あなたは5

を評価するために、F1をオブジェクトへの参照を交換する

faces[i] = 5 

を実行しているループ内

次のことを試してみてください。

faces = [{value: 0}, {value: 0}, {value: 0}, {value: 0}, {value: 0}, {value: 0}]; 

faces[i].value = 5; 

alert("faces are: " + face[0].value+ ", " + face[1].value+ ", " + face[2].value+ ", " + face[3].value+ ", " + face[4].value+ ", " + face[5].value); 
+0

配列は、すべてがゼロである変数f1〜f6からコピーされた型numberの値で初期化されます。 – traktor53

関連する問題