Переменная изменилась до факта, можете ли вы объяснить это поведение Chrome V8? - PullRequest
4 голосов
/ 01 декабря 2010

Я писал программу на javascript и запускал ее в Chrome 7, когда столкнулся со странным поведением. Теперь, в моем коде, со всеми остальными вещами, мне потребовалось некоторое время, чтобы понять, что это был не я.

Я разобрал суть кода ниже.

<html>

<script>

var data = [1,2,3,4,5];

var data_copy = [];

for (var i=0; i<data.length; i++){
    data_copy.push(data[i]);
}

console.log("Printing before:");
console.log(data_copy);

//alert(data_copy);

console.log("------------------------");

for (var i=0; i<data_copy.length; i++){
    data_copy[i] = data_copy[i] * 1000;
}

console.log("Printing after:");
console.log(data_copy);

</script>

</html>

Когда я запускаю это в Chrome 7, я получаю вывод, который следует в консоли Javascript:

Printing before:
[1000, 2000, 3000, 4000, 5000]
------------------------
Printing after:
[1000, 2000, 3000, 4000, 5000]

Почему первый вызов console.log выводит измененную версию data_copy?

Теперь, если я раскомментирую «alert» и запуском того же кода, я получу то, что вы обычно ожидаете:

Printing before:
[1, 2, 3, 4, 5]
------------------------
Printing after:
[1000, 2000, 3000, 4000, 5000]

Я также попробовал код в node.js и получил второй (нормальный) вывод.

Есть идеи?

Это какая-то JIT-оптимизация пошла не так?

Или я упускаю что-то очевидное?

Ответы [ 2 ]

4 голосов
/ 01 декабря 2010

Изменить console.log(data_copy) на console.log(String(data_copy)).

console.log эффективно отправляет объект по ссылке на консоль Chrome. alert прерывает ваш скрипт, так что первый зарегистрированный data_copy будет обработан до более поздней модификации; без, весь сценарий завершается до того, как консоль отобразит либо data_copy ссылку.

1 голос
/ 01 декабря 2010

См. Crbug.com/44720

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...