Comenzaré con el código:
var s = ["hi"];
console.log(s);
s[0] = "bye";
console.log(s);
Simple, ¿verdad? En respuesta a esto, Firebug dice:
["hi"]
["bye"]
Maravilloso, pero la consola JavaScript de Chrome (7.0.517.41 beta) dice:
["bye"]
["bye"]
¿He hecho algo mal o la consola JavaScript de Chrome está siendo extremadamente floja al evaluar mi matriz?
javascript
arrays
logging
google-chrome
console
Eric Mickelsen
fuente
fuente
i
información sobre herramientas del icono azul dice "El valor a continuación se evaluó en este momento".Respuestas:
Gracias por el comentario, tec. Pude encontrar un error existente de Webkit no confirmado que explica este problema: https://bugs.webkit.org/show_bug.cgi?id=35801 (EDITAR: ¡ahora solucionado!)
Parece haber cierto debate sobre cuánto de un error es y si es reparable. Me parece un mal comportamiento. Fue especialmente preocupante para mí porque, al menos en Chrome, ocurre cuando el código reside en scripts que se ejecutan inmediatamente (antes de que se cargue la página), incluso cuando la consola está abierta, cada vez que se actualiza la página. Llamar a console.log cuando la consola aún no está activa solo da como resultado una referencia al objeto que está en cola, no el resultado que contendrá la consola. Por lo tanto, la matriz (o cualquier objeto) no se evaluará hasta que la consola esté lista. Realmente es un caso de evaluación perezosa.
Sin embargo, hay una manera simple de evitar esto en su código:
Al llamar a toString, crea una representación en la memoria que no se verá alterada por las siguientes declaraciones, que la consola leerá cuando esté lista. La salida de la consola es ligeramente diferente de pasar el objeto directamente, pero parece aceptable:
fuente
Según la explicación de Eric, se debe a que
console.log()
está en cola e imprime un valor posterior de la matriz (u objeto).Puede haber 5 soluciones:
fuente
Puede clonar una matriz con
Array#slice
:Una función que puede usar en lugar de
console.log
que no tenga este problema es la siguiente:Para el caso de los objetos, desafortunadamente, el mejor método parece ser depurar primero con un navegador que no sea WebKit, o escribir una función complicada para clonar. Si solo está trabajando con objetos simples, donde el orden de las teclas no importa y no hay funciones, siempre puede hacer lo siguiente:
Obviamente, todos estos métodos son muy lentos, por lo que incluso más que con los
console.log
s normales , debe quitarlos después de que haya terminado la depuración.fuente
Esto se ha parcheado en Webkit, sin embargo, cuando uso el marco React, esto me sucede en algunas circunstancias, si tiene tales problemas, simplemente use como otros sugieren:
fuente
JSON.parse(JSON.stringify(event))
no obtiene la profundidad / precisión correcta. Las declaraciones de depurador son la única solución real que he encontrado para obtener la información correcta.Esto ya está respondido, pero de todos modos dejaré mi respuesta. Implementé un contenedor de consola simple que no sufre este problema. Requiere jQuery.
Solo implementa
log
,warn
y loserror
métodos, tendrá que agregar un poco más para que sea intercambiable con un regularconsole
.fuente
Parece que Chrome está reemplazando en su fase de "precompilación" cualquier instancia de "s" con un puntero a la matriz real.
Una forma de evitarlo es clonando la matriz, registrando una copia nueva en su lugar:
fuente
La solución más corta hasta el momento es utilizar una sintaxis de matriz o de dispersión de objetos para obtener un clon de valores que se conservarán en el momento del registro, es decir:
Sin embargo, tenga en cuenta que se trata de una copia superficial, por lo que los valores no primitivos anidados profundos no se clonarán y, por lo tanto, se mostrarán en su estado modificado en la consola
fuente