2011-01-26 24 views
54

¿Puede alguien explicar la diferencia conceptual entre ambos? Lea en algún lugar que el segundo crea una nueva matriz al destruir todas las referencias a la matriz existente y .length = 0 simplemente vacía la matriz. Pero no funcionó en mi casoDiferencia entre Array.length = 0 y Array = []?

//Declaration 
var arr = new Array(); 

El debajo de uno 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 puedo reemplazar el código con arr =[] en lugar de arr.length=0 funciona bien. ¿Alguien puede explicar lo que está pasando aquí?

+6

¿Por qué es un bucle su código (este) .html 'arr arr = + $();'? Si está agregando cosas a su matriz, debería usar 'Array.push()' en su lugar. – BoltClock

+1

Es gracioso porque ya hay una respuesta de 9 votos elevados, pero sigue siendo ** incierta ** cuál es la intención del OP ... – galambalazs

+0

@Bolt - Acabo de dar la muestra del código aquí, el código original agrega los elementos dinámicamente a la matriz .. Elegí agregar los elementos a la matriz en lugar de presionar(). ¿Eso hace una gran diferencia en lo que estoy buscando? –

Respuesta

74

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 matriz en sí. Si accede a ella a través de una variable diferente, entonces todavía obtiene la matriz modificada.

leído en alguna parte que el segundo crea una nueva matriz mediante la destrucción de 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] [] 
+0

Pero, aún así ... Después de leer su publicación, no entiendo por qué ayuda a explicar este problema. Por lo que entendí, 'arr' es una var global, y por lo tanto todas las referencias deben apuntar al mismo objeto. –

+0

Usted le dio al OP lo que pidió, pero no lo que necesitaba. :) A veces estos dos no son lo mismo. – galambalazs

+0

Gracias David, pero aún no entiendo por qué la matriz en el caso anterior no está vaciando con longitud = 0. ¿Hay algo que ver con la creación dinámica de los elementos en la matriz? –

1

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 los cuales una demostración en vivo se puede ver aquí: http://www.jsfiddle.net/8Yn7e/

Cuando establece una variable que apunta a una matriz existente para apuntar a una nueva matriz, todo lo que está d oing está rompiendo el vínculo que la variable tiene con esa matriz original.

Cuando se utiliza array.length = 0 (y otros métodos como array.splice(0, array.length) por ejemplo), que son realidad el vaciado de la matriz original.

+0

Qué navegadores don 's compatible con 'array.length = 0'? – user2013

+1

@ArthaeyAngosii: Heh, ninguno que yo sepa. Aparentemente era ingenuo y me gustó responder con basura en enero de 2011 ... gracias por señalarlo;). – Matt

0

¿Estás seguro de que realmente funciona?

Hice un pequeño experimento aquí, y tratando 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)

Cuestiones relacionadas