Почему console.log () не делает снимок переданных переменных? - PullRequest
19 голосов
/ 07 марта 2011

Сегодня я столкнулся с действительно странным поведением с использованием JavaScript.Я думаю, что понял это как-то сейчас, но я хотел бы знать, происходит ли то, что, по моему мнению, происходит на самом деле или есть какая-то другая магия.Итак, это мой код:

    var SomeObject = {};

    SomeObject.foo = function(a, b) {
       var baz = this.bar(a, b);
       console.log(baz);
       console.log(baz.left);
       SomeObject.magicalStuff(baz);
    };

    SomeObject.bar = function(a, b) {
        return {left: a-b, top: b-a};
    };

    SomeObject.magicalStuff = function(position) {
        position.left = 0;
    };

    SomeObject.foo(100, 50);

Код в jsFiddle

Вывод это что-то вроде (в зависимости от браузера):

> Object
50

Если вы развернете «Объект» (в Chrome, Safari или Firefox (Firebug), то получите:

> Object
    left: 0
    top: -50

Тогда как я ожидал бы:

> Object
    left: 50
    top: -50

ЧтоЯ думаю, что дело в том, что console.log () на самом деле просто «публикует» ссылку на консоль, которая читается, когда вы нажимаете на символ «развернуть». Но это не значит, что это побеждает цель console.log() как инструмент отладки? Я всегда ожидал, что console.log () "сделает снимок" того, что я ему передаю. Удивительно видеть выражение, которое появляется после того, как фактическая console.log () изменила вывод этого самоговызов console.log ().

Или что-то еще происходит?

Редактировать: Мне также интересно, есть ли веская причина для разработчиков браузеровреализовать console.log, как это (я думаю, что есть один, в противном случае он не будет последовательнымчерез основные браузеры).

Ответы [ 3 ]

11 голосов
/ 08 марта 2011

В Firebug есть console.dir() для того, что вы хотите.

Как правило, невозможно печатать каждый уровень вложенных свойств, поскольку объекты могут содержать циклические ссылки, такие как var a = {}; var b = {a: a}; a.b = b;

Реализовать идеальный метод clone очень сложно - я думаю, что для этого потребуется просто сбросить всю память, а ведение журнала займет очень много времени. Подумайте о console.log(window) ...

10 голосов
/ 07 марта 2011

Да, это то, что происходит. Я предполагаю, что это сделано, чтобы минимизировать накладные расходы на console.log() звонки. Все может выйти из-под контроля, если каждый объект будет глубоко клонирован для каждого вызова журнала.

Когда мне нужно обойти это, я либо JSON.stringify(), либо мелко клонирую объект, прежде чем передать его console.log().

6 голосов
/ 07 марта 2011

Я также видел это поведение, и похоже, что ссылка опубликована.Чтобы обойти это, я использовал метод clone () в jQuery для вещей, которые я хотел записать.

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