Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Непонятное поведение - console.log (https://javascript.ru/forum/misc/43209-neponyatnoe-povedenie-console-log.html)

Artyom 26.11.2013 18:22

Непонятное поведение - console.log
 
Добрый вечер.
Обнаружил непонятное поведение функции console.log (или декримента?). Есть код следующего вида:

var x = [0, 1, 1, 0];
console.log(x);
x[1]--;
console.log(x);


По какой-то причине Хром (и новая опера) выводят в консоль оба раза [0, 0, 1, 0]. И только 10й IE выводит ожидаемый результат - сначала [0, 1, 1, 0], а потом [0, 0, 1, 0]. В других браузерах, кроме этих трёх, не проверял. Почему так происходит?

Artyom 26.11.2013 19:51

Вложений: 1
Цитата:

Сообщение от Rise (Сообщение 282971)
Потому что это ваши иллюзии...

Спасибо за ваше мнение.

ksa 26.11.2013 20:38

Оно не только его... :D

Artyom 26.11.2013 20:43

Это прекрасно, но ведь и я не из головы это взял - точно так же привёл скриншот, сделанный буквально только что. Кто может объяснить такую аномалию?

Maxmaxmaximus3 27.11.2013 02:40

Это происходит потому что консоль вебкитов кэширует обьект отображаемый в консоли и не перерисовывает его в реальном времени. ВИДИМО. можешь попробовать алертом и все будет работать, можешь попробовать выводить приметив console.log(x[1]) и все будет работать. такая вот особенность консоли в хроме, и ДА, она всех бесит

Artyom 27.11.2013 10:31

Maxmaxmaximus3,
Спасибо. Я голову сломал, почему console.log выводит массив с нулём, а следующей строчкой элемент этого массива равным единице. Вот такой вот весёлый дебаггинг...

animhotep 27.11.2013 12:31

breakpoint-ы тебя спасут

FINoM 27.11.2013 18:09

Цитата:

Сообщение от Maxmaxmaximus3
она всех бесит

Не отвечай за всех. Такая особенность позволяет видеть реальное состояние объекта. Для того, чтоб увидеть, как он меняется во времени, просто клонируй его.

Maxmaxmaximus3 28.11.2013 03:37

Цитата:

Сообщение от FINoM
Не отвечай за всех.

Ты говоришь актуальное, актуальное оно на момент просмотра, и если ты просмотрел обьект, а потом что-то изменилось в нем, и ты еще раз его просмотришь, то изменений уже не будет, это баг а не фитча, при чем он необходим для оптимизации консоли и не для чего более. Но ты можешь переубедить меня: Приведи хотя бы один пример когда такое поведение консоли хорошо а не плохо.

kobezzza 28.11.2013 12:22

Это происходит потому, что console.log возвращает ссылку и некоторые отладчики отображают всегда реальное состояние объекта по этой ссылке (т.к. отображение происходит после изменений данных), а там где отображение идёт последовательно (например в Фаербаге, то более ожидаемый результат). Если же "развернуть" ссылку которую даёт отладчик, то везде конечно же будет актуальное состояние объекта.

Это не баг, и не фича, по идеи console.log так и должен работать, т.е. он просто выводит в консоль ссылку или элементарное значение, а то, что в ФФ или ИЕ он ещё и показывает некоторое состояние на момент вызова - это просто сделано ради удобства.

BallsShaped 28.11.2013 13:39

Цитата:

Сообщение от animhotep
breakpoint-ы тебя спасут

Согласен, отладка через console.log - для нубов!

Maxmaxmaximus3 28.11.2013 15:30

Цитата:

Сообщение от kobezzza
Используйте console.dir и всё будет ок.

Разницы нет вообще-то =)

Цитата:

Сообщение от BallsShaped
Согласен, отладка через console.log - для нубов!

А я алертами отлаживаю и консолью потому что мне брейкпойнты кажутся сложными, только когда какой-то баг или надо прямо проследить что то тогда приходится пойнты ставить

Цитата:

Сообщение от kobezzza
это просто сделано ради удобства.

Ну вот я и говорю, отсутствие такого ожидаемого поведения - ужасно, и вообще с чего ты взял что лог и дир должны ссылку показывать? Они должны логировать обьект. А хроме это делуется тупо и не интуитивно. и НЕ ЛОГИЧНО.

Можете оспорить кто сможет, я уже сказал как.
Цитата:

Сообщение от Maxmaxmaximus3
Но ты можешь переубедить меня: Приведи хотя бы один пример когда такое поведение консоли хорошо а не плохо.


kobezzza 28.11.2013 15:39

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 283305)
Разницы нет вообще-то =)

dir должен отображать входной объект как JS объект, т.е. for in {key: value}, а log просто выводить строковое представление или ссылку

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 283305)
и вообще с чего ты взял что лог и дир должны ссылку показывать?

Читал драфт стандарта для console API

UPD: похоже нормально Console API так и не стандартизировали. Но для FF console.dir помог бы.
В общем универсальный молоток:

console.log(...);
debugger; // точка останова

Maxmaxmaximus3 28.11.2013 18:23

Цитата:

Сообщение от kobezzza
dir должен отображать входной объект как JS объект, т.е. for in {key: value}, а log просто выводить строковое представление или ссылку

Спасибо кэп, я говорю про кэширование что разницы нет =) оно ведет себя одинакового в них.

Цитата:

Сообщение от kobezzza
debugger

FFFFFUUU век живи век учись! Чего я еще не знаю)? Кто поддерживает?
ну, собственно вот http://habrahabr.ru/post/76485/
я думал это только в ноде работает

kobezzza 28.11.2013 18:49

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 283351)
Спасибо кэп, я говорю про кэширование что разницы нет =) оно ведет себя одинакового в них.

Я этого не знал (т.к. юзаю FF) и искренне верил, что dir поможет, т.к. во всех остальных браузерах он помогает :)

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 283351)
FFFFFUUU век живи век учись! Чего я еще не знаю)? Кто поддерживает?
ну, собственно вот http://habrahabr.ru/post/76485/
я думал это только в ноде работает

Все поддерживают :) Но в ноде, только при запуске в режиме отладки работает.

Maxmaxmaximus3 28.11.2013 20:13

в принципе кому надо может переопределить и не парится, но лучше бы это было из коробки как в лисе.

Цитата:

Сообщение от kobezzza
юзаю FF

но зачем? хром же лучше. я серьезно

kobezzza 28.11.2013 20:19

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 283366)
но зачем? хром же лучше. я серьезно

Для меня серьёзно лучше ФФ:) Давай не будем устраивать холивары, ок?

Maxmaxmaximus3 28.11.2013 20:21

эм.... ну ладно, но для меня вообще нет ничего холи. по этому мне трудно определять. наверное по этому вы угляживаете троллинг в моих словах где то =)для меня нет ни чо такого в том чтобы сравнить браузеры... буду знать что есть те для кого это больная тема. сори.

kobezzza 28.11.2013 20:33

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 283368)
эм.... ну ладно, но для меня вообще нет ничего холи. по этому мне трудно определять. наверное по этому вы угляживаете троллинг в моих словах где то =)для меня нет ни чо такого в том чтобы сравнить браузеры... буду знать что есть те для кого это больная тема. сори.

Это нормально сравнивать браузеры, но ненормально навязывать своё мнение.

Мне больше нравится рендер SVG в Chrome, нежели в ФФ, но гораздо больше нравится рендер шрифтов в ФФ, нежели в Хроме (кто подключал символьные шрифты в Хроме, то наверняка прибегал к хаку подключения SVG шрифтов чтобы не было смазывания).

Мне нравится, что открыв консоль ФФ я уже могу трениться со многими новыми фичами вроде деструкторизаций или Arrow Function, а в хроме мало того что нужно включить флаг (ну да ладно), так ещё и поддержка новых фишек реально хуже (так например недавно пришлось писать полифил для canvas.toBlob для хрома, а в ИЕ и ФФ было).

А отладчик мне ваще больше нравится в ИЕ11:)

Если сравнивать производительность VM JS, то утверждение, что "V8 самый быстрый зверь" уже миф, в большинстве случаев они примерно одинаковы, но слабые или сильные стороны есть у всех.

В ФФ объективно тормозит старичок Гекко, но Мозиловцы уже неск лет пилят ему замену, а пока реально от версии к версии улучшают работу.

Ваще если взять средне арифметическое от качеств любого топового браузера, то результат будет примерно одинаков, поэтому я и не вижу смысла переходить, тем более что я уже "прирос" к ФФ и не хочу менять привычки.

Maxmaxmaximus3 28.11.2013 20:50

kobezzza, даже слова поперек сказать не могу.


Часовой пояс GMT +3, время: 22:54.