¿La consola de JavaScript de Chrome es vaga sobre la evaluación de matrices?



Answers

De 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:

1. arr.toString()   // not well for [1,[2,3]] as it shows 1,2,3
2. arr.join()       // same as above
3. arr.slice(0)     // a new array is created, but if arr is [1, 2, arr2, 3] 
                    //   and arr2 changes, then later value might be shown
4. arr.concat()     // a new array is created, but same issue as slice(0)
5. JSON.stringify(arr)  // works well as it takes a snapshot of the whole array 
                        //   or object, and the format shows the exact structure
Question

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 de JavaScript de Chrome (7.0.517.41 beta) dice:

["bye"]
["bye"]

¿He hecho algo mal, o la consola de Chrome de Chrome es excepcionalmente vago para evaluar mi matriz?




Parece que Chrome está reemplazando en su fase de "pre compilació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:

var s = ["hi"];
console.log(CloneArray(s));
s[0] = "bye";
console.log(CloneArray(s));

function CloneArray(array)
{
    var clone = new Array();
    for (var i = 0; i < array.length; i++)
        clone[clone.length] = array[i];
    return clone;
}



Esto ha sido parcheado en Webkit; sin embargo, cuando se usa el framework React, esto sucede para mí en algunas circunstancias, si tiene tales problemas simplemente use como otros sugieren:

console.log(JSON.stringify(the_array));



Links