12

Написал простой пример с изменением объекта в функции при передаче по ссылке. https://plnkr.co/edit/kR9zRc0Y...

var salaries = {
    "Вася": 100,
    "Петя": 300,
    "Даша": 250
};

function changeObject(object) {
    for (var key in object) {
        object[key] += 100;
    }
}

console.log(salaries);
changeObject(salaries);
console.log(salaries);

В итоге результат:

Object {Вася: 100, Петя: 300, Даша: 250}
Object {Вася: 200, Петя: 400, Даша: 350}

Передача по ссылке происходит, но console.log() отрабатывает не так как ожидается, как будто Chrome (Version 49.0.2623.110 (64-bit)) фиксирует состояние объекта на момент console.log(), хотя вроде должен ссылаться на один и тот же измененный объект.

Кто знает в чем может быть дело?

OxFF
  • 123
  • 3
    А что не так? был массив объектов, вывели, каждый элемент +100, вывели, вроде бы всё правильно. Я про JS не особо знаю. – pavel Apr 05 '16 at 08:58
  • 3
    Ну так вы же сами изменили значения каждого поля на 100. Все правильно вам показало вроде как. Какой результат вы ожидали увидеть? – Moonvvell Apr 05 '16 at 09:05
  • 1
    вобще-то всё работает как надо, а что должно было произойти ???? –  Apr 05 '16 at 10:22
  • Ваш код отрабатывает так, как должен. Думаю вам стоит добавить еще и вывод, который вы ожидаете увидеть. – Dmitriy Simushev Apr 05 '16 at 10:26

2 Answers2

18

Суть заключается в том, как работает консоль в хроме. И конкретно, функция log.

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

введите сюда описание изображения

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

введите сюда описание изображения

будет показано состояния объекта на момент разворачивания.

Чтобы избежать такой неоднозначности, можно использовать

console.dir

Grundy
  • 81,538
  • Да вы, наверное, телепат =) – Dmitriy Simushev Apr 05 '16 at 10:25
  • @DmitriySimushev, что есть, то есть :) ну и на английской версии обычно спрашиваю почему при развороте не совпадает значение, этакий обратный вопрос к этому – Grundy Apr 05 '16 at 10:26
  • @Grundy спасибо, ваш ответ именно то, что я хотел узнать. Не знал про такую особенность консоли. – OxFF Apr 05 '16 at 11:39
  • Это не особенность консоли , а особенность хрома при работе с выводом на консоль, то что в заголовке это нормальный вывод console.log, а то что стрелочкой это уже хром прилепливает своим встроенным дебаггером, и там уже ссылка на объект –  Apr 05 '16 at 12:28
  • @vnn198, это как-то противоречит фразе: как работает консоль в хроме? :) – Grundy Apr 05 '16 at 12:29
  • @Grundy консоль в хроме и функция log в том числе работает как и заложено в стандарте ECMA, и если бы дебаггер не прилеплял в стрелочке ссылку на объект, а тупо копировал вывод console.log то всё было бы весьма логично и понятно –  Apr 05 '16 at 12:41
0

Можно развернуть через JSON:

console.log(JSON.parse(JSON.stringify(obj)))

  • пожалуйста, постарайтесь оставлять чуть более развёрнутые ответы. дополнить ответ можно, нажав [edit]. в частности, стоит изложить, каким именно образом написанное вами отвечает на вопрос. – aleksandr barakin Jul 10 '23 at 10:01