javascript debugging console

javascript - ¿Por qué console.log() no toma una instantánea de las variables pasadas?



debugging (3)

Me he encontrado con un comportamiento muy extraño con javascript hoy. Creo que ya lo entendí de alguna manera, pero me gustaría saber si lo que creo que está pasando realmente está sucediendo o si hay alguna otra magia involucrada. Así que este es mi código:

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);

El código en jsFiddle

La salida de esto es algo como (dependiendo del navegador):

> Object 50

Si expandes el "Objeto" (en Chrome, Safari o Firefox (Firebug) lo que obtienes es:

> Object left: 0 top: -50

Mientras que yo esperaría:

> Object left: 50 top: -50

Lo que creo que está sucediendo es que console.log () realmente solo "publica" una referencia a la consola, que se lee una vez que se hace clic en el símbolo "expandir". Pero, ¿ese tipo de derrota no es el propósito de console.log () como un instrumento de depuración? Siempre esperé que console.log () hiciera "una instantánea" de las cosas que le paso. Es realmente sorprendente ver una declaración que viene después de que console.log () cambie la salida de esa llamada de console.log ().

¿O hay alguna otra cosa ocurriendo?

Edición: También me pregunto si hay una buena razón para que los desarrolladores de navegadores implementen console.log de esta manera (supongo que hay una, de lo contrario no sería coherente en los principales navegadores).


Hay console.dir() para lo que quieres en Firebug.

En general, no es posible imprimir todos los niveles de propiedades anidadas, ya que los objetos pueden contener referencias circulares como var a = {}; var b = {a: a}; ab = b; var a = {}; var b = {a: a}; ab = b;

Implementar un método de clone perfecta es muy difícil. Supongo que básicamente debería volcar toda la memoria, y el registro tomaría mucho tiempo. Piensa en console.log(window) ...


Sí, esto es lo que está pasando. Supongo que se hace para minimizar la sobrecarga de las llamadas de console.log() . Las cosas podrían salirse de control si todos los objetos se clonaran en profundidad para cada llamada de registro.

Cuando necesito solucionar esto, yo JSON.stringify() o JSON.stringify() superficialmente el objeto antes de pasarlo a console.log() .


También he visto este comportamiento y seguro que parece que se ha publicado una referencia. Para solucionar esto utilicé el método clone() en jQuery en las cosas que quería registrar.