2011-01-26 2 views
54

Quelqu'un peut-il expliquer la différence conceptuelle entre les deux. Lisez quelque part que le second crée un nouveau tableau en détruisant toutes les références au tableau existant et le .length = 0 vide juste le tableau. Mais cela n'a pas fonctionné dans mon casDifférence entre Array.length = 0 et Array = []?

//Declaration 
var arr = new Array(); 

Le code suivant est le code de bouclage qui s'exécute encore et encore.

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

Mais si je remplace le code avec arr =[] en place de arr.length=0 il fonctionne très bien. Quelqu'un peut-il expliquer ce qui se passe ici.

+6

Pourquoi votre code 'arr = mise en boucle arr + $ (this) .html();'? Si vous ajoutez des éléments à votre tableau, vous devriez utiliser 'Array.push()' à la place. – BoltClock

+1

C'est marrant parce qu'il y a déjà une réponse 9 upvoted, mais c'est encore ** peu clair ** ce que l'int OP est – galambalazs

+0

@Bolt - Je viens de donner l'exemple du code ici, le code original ajoute dynamiquement les éléments au tableau J'ai choisi d'ajouter les éléments à array au lieu de push(). Cela fait-il beaucoup de différence dans ce que je cherche? –

Répondre

74

foo = [] crée un nouveau tableau et lui assigne une référence à une variable. Toute autre référence n'est pas affectée et pointe toujours vers le tableau d'origine.

foo.length = 0 modifie le tableau lui-même. Si vous y accédez via une variable différente, vous obtenez toujours le tableau modifié.

lu quelque part que le second crée un nouveau tableau en détruisant toutes les références au tableau existant

C'est en arrière. Il crée un nouveau tableau et ne détruit pas d'autres références.

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); 

donne:

[] [] [1, 2, 3] [] 
+0

Mais, toujours ... Après avoir lu votre message, je ne comprends pas pourquoi cela aide à expliquer ce problème. De ce que j'ai compris, 'arr' est une var globale, et donc toutes les références devraient pointer vers le même objet. –

+0

Vous avez donné à l'OP ce qu'il a demandé, mais pas ce dont il avait besoin. :) Parfois, ces deux ne sont pas les mêmes. – galambalazs

+0

Merci David, mais je ne comprends toujours pas pourquoi le tableau dans le cas ci-dessus ne se vide pas avec length = 0. Y at-il quelque chose à faire avec la création dynamique des éléments dans le tableau. –

1

La différence est le mieux démontré dans l'exemple suivant ici:

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); 

Dont une démonstration en direct peut être vu ici: http://www.jsfiddle.net/8Yn7e/

Lorsque vous définissez une variable qui pointe vers un tableau existant pour pointer vers un nouveau tableau, tout ce que vous êtes oing rompt le lien que la variable a avec ce tableau original.

Lorsque vous utilisez array.length = 0 (et d'autres méthodes comme array.splice(0, array.length) par exemple), vous êtes en fait vider le tableau original.

+0

Quels navigateurs don 't supporte 'array.length = 0'? – user2013

+1

@ArthaeyAngosii: Heh, aucun dont je suis au courant. Apparemment, j'étais naïf et aimais répondre avec des détritus en janvier 2011 ... merci de le signaler;). – Matt

0

Etes-vous sûr que cela fonctionne vraiment?

J'ai fait un peu d'expérience ici, et en essayant d '"ajouter" un tableau avec une chaîne de caractères, j'ai trouvé une chaîne.

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

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

(testé dans Opera 11)

Questions connexes