2012-08-14 17 views
256

En Chrome el objeto console define dos métodos que parecen hacer lo mismo:¿Cuál es la diferencia entre console.dir y console.log?

console.log(...) 
console.dir(...) 

He leído en alguna línea que dir toma una copia del objeto antes de iniciar la misma, mientras que log simplemente pasa la referencia a la consola , lo que significa que para el momento en que vaya a inspeccionar el objeto que inició sesión, puede haber cambiado. Sin embargo, algunas pruebas preliminares sugieren que no hay diferencia y que ambos muestran potencialmente objetos en diferentes estados que cuando se registraron.

Prueba esto en la consola de cromo (Ctrl + Shift + J) para ver lo que quiero decir:

> o = { foo: 1 } 
> console.log(o) 
> o.foo = 2 

Ahora, expanda el [Object] debajo de la declaración de registro y observe que se muestra foo con un valor de 2. Lo mismo es cierto si repite el experimento usando dir en lugar de log.

Mi pregunta es, ¿por qué existen estas dos funciones aparentemente idénticas en console?

+51

Pruebe 'console.log ([1,2])' y 'console.dir ([1,2])' y verá la diferencia. –

+0

En firebug, el contenido de un objeto registrado con 'console.dir' no cambia, por lo que hace una gran diferencia. –

+3

Tenga cuidado con 'console.dir()': esta función es [no estándar] (https://developer.mozilla.org/docs/Web/API/Console/dir)! Así que no lo use en la producción;) – fred727

Respuesta

245

En Firefox, estas funciones se comportan de manera muy diferente: log sólo se imprime una representación toString, mientras que dir impresiones de un árbol navegable.

En Chrome, log ya imprime un árbol - la mayoría del tiempo. Sin embargo, Chrome log todavía stringified ciertas clases de objetos, incluso si tienen propiedades.Quizás el ejemplo más claro de una diferencia es una expresión regular:

> console.log(/foo/); 
/foo/ 

> console.dir(/foo/); 
* /foo/ 
    global: false 
    ignoreCase: false 
    lastIndex: 0 
    ... 

también se puede ver una clara diferencia con matrices (por ejemplo, console.dir([1,2,3])) que están log GED diferente de objetos normales:

> console.log([1,2,3]) 
[1, 2, 3] 

> console.dir([1,2,3]) 
* Array[3] 
    0: 1 
    1: 2 
    2: 3 
    length: 3 
    * __proto__: Array[0] 
     concat: function concat() { [native code] } 
     constructor: function Array() { [native code] } 
     entries: function entries() { [native code] } 
     ... 

DOM los objetos también muestran un comportamiento diferente, as noted on another answer.

+7

No olvide que console.dir guarda una referencia al objeto. Probablemente no desee usarlo extensivamente en producción. Probablemente solo funcione si la consola se muestra tho. –

+0

En Chromium 45 en Ubuntu, 'console.log' parece ser la versión simplificada de" Firefox "que se parece a' toString' en lugar de a un árbol. Todavía no estoy seguro cuando lo cambiaron, pero lo hicieron. – icedwater

+1

@icedwater: Depende de si tiene la consola abierta cuando llama a 'console.log' o la abre más tarde. Sí, en serio. :-) –

2

Desde el sitio firebug http://getfirebug.com/logging/

Calling console.dir (objeto) registrará un anuncio interactivo de propiedades de un objeto, como> una versión en miniatura de la pestaña DOM.

4

Creo Firebug lo hace de manera diferente a las herramientas de desarrollo de Chrome. Parece que Firebug te da una versión del objeto en forma de cadena mientras que console.dir te da un objeto expandible. Ambos te dan el objeto expandible en Chrome, y creo que de ahí viene la confusión. O solo es un error en Chrome.

En Chrome, ambos hacen lo mismo. Ampliando su prueba, he notado que Chrome obtiene el valor actual del objeto cuando lo expande.

> o = { foo: 1 } 
> console.log(o) 
Expand now, o.foo = 1 
> o.foo = 2 
o.foo is still displayed as 1 from previous lines 

> o = { foo: 1 } 
> console.log(o) 
> o.foo = 2 
Expand now, o.foo = 2 

Puede usar lo siguiente para obtener una versión codificada de un objeto si eso es lo que desea ver. Esto le mostrará qué es el objeto en el momento en que se llama a esta línea, no cuando la expande.

console.log(JSON.stringify(o)); 
0

Siguiendo los consejos de Felix Klings Lo probé en mi navegador de Chrome.

console.dir ([1,2]) da el siguiente resultado:

Array [2]

0: 1

1: 2

longitud: 2

_ proto _: Array [0]

Mientras console.log ([1,2]) da el siguiente resultado:

[1, 2]

Así que creo que console.dir() debería usarse para obtener más información como prototipos, etc. en matrices y objetos.

100

Existe otra diferencia útil en Chrome al enviar elementos DOM a la consola.

Aviso:

  • console.log imprime el elemento en un árbol en HTML, como
  • console.dir imprime el elemento en un árbol JSON-como

Específicamente, console.log da tratamiento especial para los elementos DOM, mientras que console.dir no lo hace. Esto a menudo es útil cuando se trata de ver la representación completa del objeto DOM JS.

Hay más información en el Chrome Console API reference acerca de esta y otras funciones.

+0

Creo que esta información es de https://developer.mozilla.org/en-US/docs/Web/API/Console/log – loneshark99

+0

@ loneshark99 en realidad es al revés. Observe la URL en su captura de pantalla? Copiaron mi respuesta. Pero eso está bien porque eso está permitido por la licencia en las respuestas de SO y, de todos modos, amo a MDN. –

+0

Entendido, eso es lo que inicialmente estaba pensando, pero luego pensé por qué iban a copiar desde aquí. Tiene sentido . Buena información – loneshark99

Cuestiones relacionadas