Подтвердить что ты не робот

Неверное значение в 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] ? И в чем разница между двумя вышеуказанными случаями, разные ответы в обоих случаях?

4b9b3361

Ответ 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.