Unterschied zwischen Array.length = 0 und Array = []?

70

Kann jemand den konzeptuellen Unterschied zwischen beiden erklären? Lesen Sie irgendwo, dass der zweite ein neues Array erstellt, indem Sie alle Verweise auf das vorhandene Array zerstören und die .length = 0 das Array nur leert. Aber in meinem Fall hat es nicht funktioniert

//Declaration 
var arr = new Array();

Der folgende ist der Schleifencode, der immer wieder ausgeführt wird.

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

Aber wenn ich den Code durch arr =[]anstelle von ersetze arr.length=0, funktioniert das einwandfrei. Kann mir jemand erklären, was hier passiert.

Srikanth Rayabhagi
quelle
6
Warum wird Ihr Code wiederholt arr = arr + $(this).html();? Wenn Sie Ihrem Array Inhalte hinzufügen, sollten Sie Array.push()stattdessen verwenden.
BoltClock
1
Es ist lustig, weil es bereits eine 9-Stimmen-Antwort gibt, aber es ist immer noch unklar, was die Absicht des OP ist ...
gblazex
@Bolt - Ich habe hier nur das Beispiel des Codes angegeben. Der ursprüngliche Code fügt die Elemente dynamisch zum Array hinzu. Ich habe mich dafür entschieden, die Elemente anstelle von push () an das Array anzuhängen. Macht das einen großen Unterschied in dem, wonach ich suche?
Srikanth Rayabhagi
1
Der zweite Codeblock oben ist in einer Schleife? Wenn dies der arrFall ist, wird das Array bei der ersten Ausführung geleert, aber nach der ersten Ausführung dieses Codeblocks wird auf eine Zeichenfolge verwiesen, sodass von da an arr.lengthkeine Auswirkung mehr besteht (wie dies lengthschreibgeschützt ist) Eigenschaft von String). arr = []wird arrzu Beginn jeder Iteration wieder in ein leeres Array konvertiert , aber dann konvertieren Sie es sofort wieder in einen String. Also haben Sie entweder Ihren Code gebrochen, als Sie versucht haben, ihn für dieses Beispiel zu vereinfachen, oder Sie machen nur sehr seltsame
Dinge
Mögliches Duplikat von Wie leere ich ein Array in JavaScript?
Shadow Wizard impft

Antworten:

92

foo = []Erstellt ein neues Array und weist einer Variablen einen Verweis darauf zu. Alle anderen Referenzen sind nicht betroffen und verweisen weiterhin auf das ursprüngliche Array.

foo.length = 0ändert das Array selbst. Wenn Sie über eine andere Variable darauf zugreifen, erhalten Sie immer noch das geänderte Array.

Lesen Sie irgendwo, dass der zweite ein neues Array erstellt, indem Sie alle Verweise auf das vorhandene Array zerstören

Das ist rückwärts. Es erstellt ein neues Array und zerstört keine anderen Referenzen.

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

gibt:

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

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

und es leert das Array zumindest beim ersten Mal. Nach dem ersten Mal tun Sie dies:

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

… Die das Array mit einem String überschreibt .

Die lengthEigenschaft einer Zeichenfolge ist schreibgeschützt, sodass die Zuweisung 0keine Auswirkung hat.

QUentin
quelle
3

Der Unterschied wird hier am besten anhand des folgenden Beispiels demonstriert:

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

Eine Live-Demo finden Sie hier: http://www.jsfiddle.net/8Yn7e/

Wenn Sie eine Variable festlegen, die auf ein vorhandenes Array verweist, um auf ein neues Array zu verweisen, müssen Sie lediglich die Verknüpfung der Variablen zu diesem ursprünglichen Array aufheben.

Wenn Sie array.length = 0(und andere Methoden wie array.splice(0, array.length)zum Beispiel) verwenden, leeren Sie tatsächlich das ursprüngliche Array.

Matt
quelle
1
Welche Browser unterstützen nicht array.length = 0?
Arthaey
1
@ArthaeyAngosii: Heh, keiner, den ich kenne. Anscheinend war ich naiv und habe es genossen, im Januar 2011 mit Müll zu antworten ... danke, dass du darauf hingewiesen hast;).
Matt
-1

Bist du sicher, dass es wirklich funktioniert?

Ich habe hier ein kleines Experiment durchgeführt, und der Versuch, ein Array mit einem String "hinzuzufügen", führte zu einem String.

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

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

(getestet in Opera 11)

Denilson Sá Maia
quelle