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.