2012-06-26 2 views
12

Возможный дубликат:
Is Chrome's JavaScript console lazy about evaluating arrays?Неправильное значение в console.log

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

+0

Я получил ваш ожидаемый результат в последней версии Chrome. –

+0

Я получил ожидаемый результат в firefox. – bjelli

+0

yep, в последней версии chrome – gopi1410

ответ

14

Это связано с тем, что журнал задерживается до тех пор, пока Chrome не успеет это сделать (т. Е. Ваши сценарии освобождают процессор).

Попробуйте это понять, что происходит:

var t=[0,2]; 
console.log(t); 
setTimeout(function() { 
    t[0]+=2; 
    console.log(t); 
}, 1000); 

Он выводит то, что вы ожидаете.

Это ошибка Chrome? Может быть, побочный эффект оптимизации. По крайней мере, это опасный дизайн ...

Почему существует разница? Я полагаю, что Chrome временно сохраняет то, что он должен регистрировать, как первичное (неизменяемое) значение в первом случае, как указатель на массив в последнем случае.

+3

да, очень часто они играют с огнем – Sebas

+0

yep, хром, похоже, сейчас много изменений .. спасибо btw :) – gopi1410

0

Все, что вы делаете, является правильным, но регистрация хрома завинчивается/задерживается. Попробуйте сделать копию переменной и добавить к ней, и вы увидите, что ваш код верен.

5

console.log in chrome/ff является асинхронным, а объекты, которые регистрируются, интерпретируются в момент их расширения. , Вместо того, чтобы сделать копию объекта, если вы хотите, чтобы увидеть его значение в то время (для массива):

t=[0,2]; 
console.log(t.slice(0)); 
t[0]+=2; 
console.log(t); 

С массивом, вызывая .slice будет дублировать массив, а не создать ссылку. Я бы не предложил использовать тайм-аут: это действительно не решить проблема, просто обходит ее временно.

0

Регистрация Chrome задерживается в новых версиях, без проблем с вашего конца. Сделайте копию переменной или используйте setTimeout.

Смежные вопросы