Я новичок в программировании и 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, поскольку кажется, что работает только присвоение его переменным в индексе.

1
GomuGomu 11 Янв 2017 в 23:33

4 ответа

Лучший ответ

Вы не изменяете значение fx, так как они являются простыми типами данных (int), это called by value. Простые типы не являются объектами, которые могут быть called by reference. Посмотрите этот вопрос: Является ли JavaScript переходным язык ссылок или передачи по значению?

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);
1
Community 23 Май 2017 в 12:25

Это потому, что вы передаете ссылку на объект в массив. когда вы впервые инициализируете массив.

Внутри цикла вы выполняете

faces[i] = 5

Вы заменяете ссылку на объект f1 на значение 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
Adrian Bratu 11 Янв 2017 в 20:41

Похоже, ваш код ожидает обновления переменных при обновлении faces по индексу массива, но faces[1] = 5 присваивает значение 5 faces[1], заменяя значение ({{X3 }}) изначально скопировано из f1. Повторите попытку, используя только индексы, но на этот раз измените свое оповещение на:

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

Кроме того, как указывает @StephenQuan, вам нужно использовать другую переменную индекса для внутреннего цикла

2
Rob M. 11 Янв 2017 в 22:45

См. Раздел о подъеме var. Вы используете var i во внутреннем цикле, а также во внешнем цикле. Измените это и посмотрите, поможет ли это потоку. Также я хотел бы предложить, если это возможно, использовать let вместо var, если вы используете ECMA 6.

0
Yathi 11 Янв 2017 в 20:40