Неожиданный вывод на консоль Javascript с назначением массива; - PullRequest
3 голосов
/ 25 января 2012

Я получаю неожиданный вывод консоли после назначения массива в браузерах webkit (Chrome 16.0.912.77 и Safari 5.1.2 - 7534.52.7).

Вот моя функция, которая демонстрирует ошибку:

function test() {
    var myArray = [];
    console.log(myArray); // Should be [], but is [0]
    myArray.push(0);
}

Я получаю ожидаемый вывод [] в Firefox 7.0.1.

[EDIT]

Когда я вставляю длинный синхронный сон, проблема не исчезает.Это заставляет меня думать, что (1) несмотря на то, что оператор console.log является асинхронным, он выполняется в том же потоке и (2) ожидает, пока очередь событий не опустеет, прежде чем он запустится, и (3) ссылка будет передана на консоль.log превращается в строку при окончательном запуске console.log, а не при его вызове.

function sleep(millis){
  var date = new Date();
  var curDate = null;
  do { curDate = new Date(); }
  while(curDate-date < millis);
}

function test() {
    var myArray = [];
    console.log(myArray); // Should be [], but is [0]
    sleep(2000);    
    myArray.push(0);
}

Это не похоже на желаемое поведение.

1 Ответ

6 голосов
/ 25 января 2012

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

Вы можете быстро:

console.log(myArray.slice());

Вместо этого, в целях отладки.


Чтобы проверить это более очевидно:

var a = []; console.log(a); a.push(1, 2, 3, 4, 5);

даст [1, 2, 3, 4, 5].

var a = []; console.log(a); setTimeout(function() {a.push(1, 2, 3, 4, 5);}, t);

даст неверный результат дляменя с т = 5 и правильный результат для т = 100.

...