2015-11-09 3 views
3
var y = {a:200,b:{}}; 
console.log(y); 
y.a = 100; 
y.b[1] = 10; 
y.b[2] = 20; 
console.log(y); 

Оба результата на консоли одинаковы. Любая идея почему?JavaScript: изменения переменных объекта

 
Result for line 2 
Object {a: 200, b: Object} a: 100 b: Object 1: 10 2: 20 
Result for Line 6 
Object {a: 100, b: Object} a: 100 b: Object 1: 10 2: 20 
+3

Консоль всегда показывает текущее состояние объекта, оно не фиксирует состояние, как оно было при регистрации. Поместите «отладчик» после первого журнала, чтобы увидеть разницу. –

ответ

3

console.log() имеет некоторые забавные модели поведения в некоторых браузерах (я видел его в Chrome), что, вероятно, связано с тем, что сама консоль находится в другом процессе и данных должен получить выстроил через границу процесса в фоновом режиме (так что это не делается синхронно с вашим исполнением Javascript).

Оказывается, что когда вы делаете что-то вроде console.log(y); и y является объектом, что сразу запоминаются для консоли является ссылкой на y, а затем где-то чуть позже, фактическое содержание y извлекаются и отображаются. Но, если в то же время ваш Javascript изменил y, то вы не обязательно получите точное значение для y, отображаемое в консоли.

Вы можете работать вокруг этого вопроса, делая это:

console.log(JSON.stringify(y)); 

И, на самом деле вы можете проверить свой код, изменяя оба ваших console.log() заявления к этому.

+0

После написания этого ответа я нашел [дублированный вопрос] (http://stackoverflow.com/questions/4057440/is-chromes-javascript-console-lazy-about-evaluating-arrays) и пометил вопрос как таковой. – jfriend00

0

Использование console.log печатает объект на консоль с помощью ссылки, вы можете войти текущее состояние объекта путем преобразования его в формат JSON в качестве альтернативы.

console.log(JSON.stringify(y)); 
Смежные вопросы