Неверное значение в console.log
Возможный дубликат:
Является ли консоль JavaScript Chrome ленивой относительно оценки массивов?
У меня есть следующие фрагменты в javascript, выход которых заставляет меня чувствовать, что что-то идет не так.
1.
a=2;
console.log(a);
a+=2;
console.log(a);
Выход: 2 4
; как ожидалось
2.
t=[0,2];
console.log(t);
t[0]+=2;
console.log(t);
Выход: [2,2] [2,2]
Не должно быть [0,2] [2,2]
? И в чем разница между двумя вышеуказанными случаями, разные ответы в обоих случаях?
Ответы
Ответ 1
Это потому, что журнал задерживается до тех пор, пока Chrome не успеет это сделать (т.е. ваши скрипты освобождают CPU).
Попробуйте это, чтобы понять, что происходит:
var t=[0,2];
console.log(t);
setTimeout(function() {
t[0]+=2;
console.log(t);
}, 1000);
Он выводит то, что вы ожидаете.
Это ошибка Chrome? Может быть, побочный эффект оптимизации. По крайней мере, это опасный дизайн...
Почему существует разница? Я полагаю, что Chrome временно сохраняет то, что он должен регистрировать в качестве первичного (неизменяемого) значения в первом случае, как указатель на массив в последнем случае.
Ответ 2
console.log в chrome/ff является асинхронным, а объекты, которые регистрируются, интерпретируются в момент их расширения., Вместо этого сделайте копию объекта, если вы хотите увидеть его значение в это время (для массива):
t=[0,2];
console.log(t.slice(0));
t[0]+=2;
console.log(t);
С массивом вызов .slice будет дублировать массив и не создавать ссылку.
Я бы не предложил использовать тайм-аут: это действительно не решает проблему, просто обходит ее временно.
Ответ 3
Все, что вы делаете, правильно, но хромированные протоколирования затянуты. Попробуйте сделать копию переменной и добавить к ней, и вы увидите, что ваш код верен.
Ответ 4
Регистрация Chrome задерживается в новых версиях, без проблем с вашего конца. Сделайте копию переменной или используйте setTimeout
.