473 Stimmen

JavaScript for...in vs for

Denkst du, dass es einen großen Unterschied zwischen for...in und for-Schleifen gibt? Welche Art von "for" ziehst du vor und warum?

Angenommen, wir haben ein Array von assoziativen Arrays:

var myArray = [{'key': 'value'}, {'key': 'value1'}];

Also können wir durchlaufen:

for (var i = 0; i < myArray.length; i++)

Und:

for (var i in myArray)

Ich sehe keinen großen Unterschied. Gibt es Leistungsprobleme?

13 Stimmen

Beachten Sie, dass wir auch ab JS 1.6 haben: myArray.forEach(callback[, thisarg]).

14 Stimmen

@ Benji array.forEach ist tatsächlich in ES5.

2 Stimmen

In einer for-in Schleife benötigen Sie eine bedingung, die so aussieht: if(myArray.hasOwnProperty(i)){true}

3voto

Chase Seibert Punkte 15327

For-Schleifen auf Arrays sind nicht mit Prototype kompatibel. Wenn Sie glauben, dass Sie diese Bibliothek in Zukunft benötigen könnten, wäre es sinnvoll, bei for-Schleifen zu bleiben.

http://www.prototypejs.org/api/array

0 Stimmen

Vergessen Sie möglicherweise "diese Bibliothek verwenden zu müssen". Denken Sie stattdessen daran, dass Ihr JS mit allem anderen enthalten sein könnte, das diese Bibliothek verwendet, denn die Probleme kommen immer noch.

3voto

bormat Punkte 1191

Eine kürzere und bessere Code laut jsperf ist

keys  = Object.keys(obj);
for (var i = keys.length; i--;){
   value = obj[keys[i]];// oder andere Aktion
}

2voto

angelito Punkte 380

for(;;) ist für Arrays : [20,55,33]

for..in ist für Objects : {x:20,y:55:z:33}

1voto

Verwenden Sie die Array().forEach-Schleife, um von Parallelität zu profitieren

4 Stimmen

JavaScript im Browser ist ereignisschleifen-konkurrierend, daher wird Array.prototype.forEach nicht mehrere Aufrufe des Rückrufs parallel ausführen.

0voto

Paulo Cheque Punkte 2627

Vorsicht!!! Ich benutze Chrome 22.0 unter Mac OS und habe ein Problem mit der for each Syntax.

Ich weiß nicht, ob dies ein Browserproblem, ein Javascript-Problem oder ein Fehler im Code ist, aber es ist SEHR merkwürdig. Außerhalb des Objekts funktioniert es perfekt.

var MyTest = {
    a:String = "a",
    b:String = "b"
};

myfunction = function(dicts) {
    for (var dict in dicts) {
        alert(dict);
        alert(typeof dict); // gibt 'string' aus (falsch)
    }

    for (var i = 0; i < dicts.length; i++) {
        alert(dicts[i]);
        alert(typeof dicts[i]); // gibt 'object' aus (korrekt, es sollte {abc: "xyz"} sein)
    }
};

MyObj = function() {
    this.aaa = function() {
        myfunction([MyTest]);
    };
};
new MyObj().aaa(); // Das funktioniert nicht

myfunction([MyTest]); // Das funktioniert

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X