recorrer objetos ejemplos asociativo array javascript arrays

javascript - objetos - Diferencia entre Array.length=0 y Array=[]?



object javascript (4)

¿Estás seguro de que realmente funciona?

Hice un pequeño experimento aquí, y al tratar de "agregar" una matriz con una cadena resultó en una cadena.

function xyz(){ var a = []; alert(typeof(a+$("#first").html())); // shows "string" }

http://www.jsfiddle.net/4nKCF/

(probado en Opera 11)

¿Alguien puede explicar la diferencia conceptual entre ambos? Lea en algún lugar que el segundo crea una nueva matriz destruyendo todas las referencias a la matriz existente y el .length = 0 simplemente vacía la matriz. Pero no funcionó en mi caso.

//Declaration var arr = new Array();

El siguiente es el código de bucle que se ejecuta una y otra vez.

$("#dummy").load("something.php",function(){ arr.length =0;// expected to empty the array $("div").each(function(){ arr = arr + $(this).html(); }); });

Pero si reemplazo el código con arr =[] en lugar de arr.length=0 , funciona bien. ¿Alguien puede explicar lo que está pasando aquí?


La configuración arr = [] crea una nueva referencia y una nueva matriz, pero la matriz antigua arr = [1,2,3] todavía existe en la memoria. El recolector de basura limpiará eso.

Mientras que arr.length = 0 mantiene la referencia de la matriz y elimina todos los elementos de esta matriz sin crear nada nuevo.


La diferencia aquí se demuestra mejor en el siguiente ejemplo:

var arrayA = [1,2,3,4,5]; function clearUsingLength (ar) { ar.length = 0; } function clearByOverwriting(ar) { ar = []; } alert("Original Length: " + arrayA.length); clearByOverwriting(arrayA); alert("After Overwriting: " + arrayA.length); clearUsingLength(arrayA); alert("After Using Length: " + arrayA.length);

De la cual se puede ver una demostración en vivo aquí: http://www.jsfiddle.net/8Yn7e/

Cuando configura una variable que apunta a una matriz existente para que apunte a una nueva matriz, todo lo que está haciendo es romper el enlace que la variable tiene con esa matriz original.

Cuando usa array.length = 0 (y otros métodos como array.splice(0, array.length) por ejemplo), en realidad está vaciando la matriz original.


foo = [] crea una nueva matriz y le asigna una referencia a una variable. Cualquier otra referencia no se ve afectada y aún apunta a la matriz original.

foo.length = 0 modifica la propia matriz. Si accede a él a través de una variable diferente, todavía obtendrá la matriz modificada.

Lea en algún lugar que el segundo crea una nueva matriz destruyendo todas las referencias a la matriz existente

Eso es al revés. Crea una nueva matriz y no destruye otras referencias.

var foo = [1,2,3]; var bar = [1,2,3]; var foo2 = foo; var bar2 = bar; foo = []; bar.length = 0; console.log(foo, bar, foo2, bar2);

da:

[] [] [1, 2, 3] []

arr.length =0;// expected to empty the array

y vacía la matriz, al menos la primera vez. Después de la primera vez que haces esto:

arr = arr + $(this).html();

... que sobrescribe la matriz con una cadena .

La propiedad de length de una cadena es de solo lectura, por lo que asignarle un 0 no tiene ningún efecto.