2017-01-11 4 views
1

Ich bin neu in der Programmierung und Javascript und habe Probleme beim Ändern eines Wertes in einem meiner Arrays durch den Index. Der Rest des Codes funktioniert gut, aber ich kann nicht scheinen, auf meine Gesichter [] durch seinen Index zuzugreifen, während in einem anderen Array es gut funktioniert.Kann den Wert in einem Array nicht ändern

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 

Der Alarm ist zu prüfen, ob die Werte ändern und es gibt 3, 0, 0, 0, 0, 0, da es nur auf die Variablen in dem Index Zuordnung scheint direkt zu arbeiten.

+0

warum das Array nicht direkt verwenden? –

+2

Ihre innere Schleife sollte nicht dieselbe "i" Variable wie Ihre äußere Schleife verwenden. Ändern Sie den Variablennamen. Auch die innere Verfassung, bist du sicher, dass es richtig ist? 'hold1 == true && i == 0' das sieht verdächtig falsch aus. –

Antwort

1

Sie nicht den Wert von fx ändern, da sie einfach Datentypen (int) sind, sind sie called by value. Einfache Typen sind keine Objekte, die called by reference sein können. Sehen Sie diese Frage: 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 verlieren Sie Bezug auf Ihre f-benannten Variablen, wenn Sie sie über 'faces [1] = ' setzen. Dies bedeutet nun, dass der indexierte Gegenstand nicht mehr auf 'f1' zeigt. – jusopi

0

Siehe Abschnitt var hoisting. Sie verwenden var i in der inneren Schleife sowie der äußeren Schleife. Ändern Sie das und sehen Sie, ob es den Fluss unterstützt. Ich würde auch vorschlagen, wenn möglich let statt var verwenden, wenn Sie ECMA verwenden 6.

2

Es sieht aus wie Ihr Code die Variablen erwartet aktualisiert werden, wenn Sie die faces in einem Array-Index aktualisieren, aber faces[1] = 5 weist den Wert 5 zu faces[1], Ersetzen des Wertes (0) ursprünglich kopiert von f1. Versuchen Sie es erneut, nur die Indizes verwenden, aber dieses Mal ändern Ihre Warnung an:

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

Auch als @StephenQuan weist darauf hin, Sie

+1

Wie wäre es mit "Ersetzen des Wertes (0) kopiert von' f1' während der Array-Initialisierung "? – traktor53

+0

Danke @ Traktor53, das war ein Fehler meinerseits. Dies ist jetzt behoben. –

0

Dies ist eine andere Indexvariable für die innere Schleife verwenden müssen, weil Sie übergeben einen Verweis auf ein Objekt in das Array. wenn Sie das Array zum ersten Mal initialisieren.

Innerhalb der Schleife Sie ausführen

faces[i] = 5 

Sie die Referenz ersetzen f1 zum Objekt 5.

Bitte versuchen Sie folgendes zu schätzen.

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

Das Array wird mit Werten vom Typ "number" initialisiert, die von den Variablen 'f1' bis' f6' kopiert werden, die alle Nullen sind. – traktor53

Verwandte Themen