@palmsey: In Fairness zu den OP, die JavaScript-Dokumentation tatsächlich ausdrücklich auf die Verwendung von Variablen des Typs Object in dieser Weise als "assoziative Arrays" beziehen.
Und fairerweise muss man @palmsey zugestehen, dass er recht hatte. Es sind keine assoziativen Arrays; es sind definitiv Objekte :) - die die Aufgabe eines assoziativen Arrays übernehmen. Aber was den weiteren Punkt angeht, scheinen Sie laut diesem sehr guten Artikel, den ich gefunden habe, definitiv Recht zu haben:
JavaScript "Assoziative Arrays" als schädlich eingestuft
Aber nach all dem, die akzeptierte Antwort selbst eine schlechte Praxis ist?
Festlegen eines Prototyps der Funktion size() für Object
Wenn etwas anderes zu Object .prototype hinzugefügt wurde, schlägt der vorgeschlagene Code fehl:
<script type="text/javascript">
Object.prototype.size = function () {
var len = this.length ? --this.length : -1;
for (var k in this)
len++;
return len;
}
Object.prototype.size2 = function () {
var len = this.length ? --this.length : -1;
for (var k in this)
len++;
return len;
}
var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
alert("age is " + myArray["age"]);
alert("length is " + myArray.size());
</script>
Ich glaube nicht, dass diese Antwort die akzeptierte sein sollte, da man sich nicht darauf verlassen kann, dass sie funktioniert, wenn im gleichen Ausführungskontext noch anderer Code läuft. Um es in einer robusten Art und Weise zu tun, sicherlich müssten Sie die Größe Methode innerhalb myArray definieren und für den Typ der Mitglieder überprüfen, wie Sie durch sie iterieren.
1 Stimmen
@neitony - das ist irgendwie wahr, aber so viele Leute sind an PHP's "assoziatives Array" gewöhnt, dass sie annehmen könnten, es bedeutet " bestellt assoziative Karte", wenn JS-Objekte in der Tat ungeordnet sind.
4 Stimmen
In dem obigen Beispiel ist myObject.length undefiniert, zumindest in einer Browserumgebung. Deshalb ist es ungültig, @AdrianM
3 Stimmen
Varianten von
Object.
{keys
,values
,entries
}(obj).length
wurden nun insgesamt 38 Mal in 16 Antworten und in den Kommentaren zu dieser Frage erwähnt, und weitere 11 Mal in 7 gelöschten Antworten. Ich denke, das ist jetzt genug.