Zugriff auf JavaScript-Eigenschaften: Punktnotation vs. Klammern?
Lesezeit: 6 Minuten
Markus Renouf
Abgesehen von der offensichtlichen Tatsache, dass die erste Form eine Variable und nicht nur ein Zeichenfolgenliteral verwenden könnte, gibt es einen Grund, eine über der anderen zu verwenden, und wenn ja, in welchen Fällen?
In Code:
// Given:
var foo = {'bar': 'baz'};
// Then
var x = foo['bar'];
// vs.
var x = foo.bar;
Kontext: Ich habe einen Codegenerator geschrieben, der diese Ausdrücke erzeugt, und ich frage mich, welcher besser ist.
Nur um einzugreifen, keine Antwort auf Ihre ursprüngliche Frage (da Sie bisher viele gute Erklärungen hatten), aber in Bezug auf die Geschwindigkeit gibt es auch keinen erwähnenswerten Unterschied: jsperf.com/dot-vs-square-brackets. Der obige Test gibt jedem von ihnen bestenfalls nur eine Marge von 2%, sie sind gleichauf.
– unwissentlich
4. September 2013 um 15:25 Uhr
Siehe auch Wie füge ich eine Eigenschaft zu einem Objekt hinzu, indem ich eine Variable als Namen verwende? und Dynamischer Zugriff auf Objekteigenschaft unter Verwendung einer Variablen
– Bergi
18. November 2014 um 6:12 Uhr
Diese Frage/Antwort kann auch für UTF-8-Schlüssel verwendet werden.
Die Notation mit eckigen Klammern erlaubt die Verwendung von Zeichen, die nicht mit der Punktnotation verwendet werden können:
var foo = myForm.foo[]; // incorrect syntax
var foo = myForm["foo[]"]; // correct syntax
einschließlich Nicht-ASCII-Zeichen (UTF-8), wie in myForm["ダ"] (mehr Beispiele).
Zweitens ist die Notation in eckigen Klammern nützlich, wenn es um Eigenschaftsnamen geht, die auf vorhersehbare Weise variieren:
for (var i = 0; i < 10; i++) {
someFunction(myForm["myControlNumber" + i]);
}
Zusammenfassen:
Die Punktnotation ist schneller zu schreiben und klarer zu lesen.
Die Notation mit eckigen Klammern ermöglicht den Zugriff auf Eigenschaften, die Sonderzeichen enthalten, und die Auswahl von Eigenschaften mithilfe von Variablen
Ein weiteres Beispiel für Zeichen, die nicht mit Punktnotation verwendet werden können, ist Eigenschaftsnamen, die selbst einen Punkt enthalten.
Beispielsweise könnte eine JSON-Antwort eine Eigenschaft namens enthalten bar.Baz.
var foo = myResponse.bar.Baz; // incorrect syntax
var foo = myResponse["bar.Baz"]; // correct syntax
In Chrome 44 auf meiner Maschine ist die Klammernotation schneller
– Austin Frankreich
12. August 2015 um 15:44 Uhr
@chenghuayang Wenn Sie auf eine Eigenschaft eines Objekts zugreifen möchten, dessen Schlüssel in einer Variablen gespeichert ist, können Sie dies nicht mit der Punktnotation tun.
– Honinbo Shusaku
8. Dezember 2016 um 16:56 Uhr
Naiquevin
Die Klammernotation ermöglicht Ihnen den Zugriff auf Eigenschaften nach Namen, die in einer Variablen gespeichert sind:
var obj = { "abc" : "hello" };
var x = "abc";
var y = obj[x];
console.log(y); //output - hello
obj.x würde in diesem Fall nicht funktionieren.
Sagar Munjal
Die beiden gängigsten Möglichkeiten, auf Eigenschaften in JavaScript zuzugreifen, sind mit einem Punkt und mit eckigen Klammern. Beide value.x und value[x] Greifen Sie nach Wert auf eine Eigenschaft zu – aber nicht unbedingt auf dieselbe Eigenschaft. Der Unterschied besteht darin, wie x interpretiert wird. Wenn Sie einen Punkt verwenden, muss der Teil nach dem Punkt ein gültiger Variablenname sein und benennt die Eigenschaft direkt. Bei Verwendung von eckigen Klammern wird der Ausdruck zwischen den Klammern ausgewertet, um den Eigenschaftsnamen zu erhalten. Während value.x die Eigenschaft von value namens „x“ abruft, value[x] versucht, den Ausdruck x auszuwerten und verwendet das Ergebnis als Eigenschaftsnamen.
Wenn Sie also wissen, dass die Eigenschaft, die Sie interessiert, „Länge“ heißt, sagen Sie value.length. Wenn Sie die durch den in der Variablen enthaltenen Wert benannte Eigenschaft extrahieren möchten idu sagst value[i]. Und weil Eigenschaftsnamen eine beliebige Zeichenfolge sein können, wenn Sie auf eine Eigenschaft mit dem Namen zugreifen möchten “2” oder “John Doe”müssen Sie eckige Klammern verwenden: value[2] oder value["John Doe"]. Dies ist der Fall, obwohl Sie den genauen Namen der Immobilie im Voraus kennen, denn weder “2” Noch “John Doe” ist ein gültiger Variablenname und kann daher nicht über die Punktnotation aufgerufen werden.
Im Fall von Arrays
Die Elemente in einem Array werden in Eigenschaften gespeichert. Da die Namen dieser Eigenschaften Zahlen sind und wir ihren Namen oft aus einer Variablen beziehen müssen, müssen wir die Klammersyntax verwenden, um auf sie zuzugreifen. Die Längeneigenschaft eines Arrays sagt uns, wie viele Elemente es enthält. Dieser Eigenschaftsname ist ein gültiger Variablenname, und wir kennen seinen Namen im Voraus. Um also die Länge eines Arrays zu ermitteln, schreiben Sie normalerweise array.length denn das ist einfacher zu schreiben als array["length"].
Könnten Sie array.length näher erläutern? Sie sagen, dass Eigenschaften, auf die über die Punktnotation zugegriffen wird, nicht ausgewertet werden. Würde es uns im Fall von array.length nicht die Zeichenfolge “Länge” anstelle des ausgewerteten Werts geben, in diesem Fall die Anzahl der Elemente im Array? The elements in an array are stored in properties das verwirrt mich. Was meinst du mit gespeichert in Eigenschaften? Was sind Eigenschaften? Nach meinem Verständnis ist Array nur eine Reihe von Werten ohne Eigenschaften. Wenn sie in Eigenschaften gespeichert sind, wie kommt es, dass dies nicht der Fall ist property: value/assoziatives Array?
– Impuls
19. November 2017 um 15:04 Uhr
Diese Antwort ist besonders wertvoll, da sie den Unterschied zwischen den beiden Notationen erklärt.
– Schachnetz
1. November 2018 um 1:39 Uhr
Die Punktnotation funktioniert bei einigen Schlüsselwörtern nicht (wie z new und class) im Internetexplorer 8.
Ich hatte diesen Code:
//app.users is a hash
app.users.new = {
// some code
}
Und dies löst den gefürchteten “erwarteten Bezeichner” aus (zumindest auf IE8 unter Windows XP, ich habe keine anderen Umgebungen ausprobiert). Die einfache Lösung dafür besteht darin, zur Klammernotation zu wechseln:
app.users['new'] = {
// some code
}
Im Allgemeinen machen sie die gleiche Arbeit.
Trotzdem gibt Ihnen die Klammernotation die Möglichkeit, Dinge zu tun, die Sie mit der Punktnotation nicht tun können, wie z
var x = elem["foo[]"]; // can't do elem.foo[];
Dies kann auf jede Eigenschaft erweitert werden, die Sonderzeichen enthält.
Benutzer2593104
Seien Sie vorsichtig bei der Verwendung dieser Notationen: Für zB. wenn wir auf eine Funktion zugreifen möchten, die im Elternteil eines Fensters vorhanden ist. Im IE:
window['parent']['func']
ist nicht gleichbedeutend mit
window.['parent.func']
Wir können entweder verwenden:
window['parent']['func']
oder
window.parent.func
um darauf zuzugreifen
Jason Roman
Sie müssen die Notation mit eckigen Klammern verwenden, wenn –
Der Eigenschaftsname ist Zahl.
var ob = {
1: 'One',
7 : 'Seven'
}
ob.7 // SyntaxError
ob[7] // "Seven"
Der Eigenschaftsname hat Sonderzeichen.
var ob = {
'This is one': 1,
'This is seven': 7,
}
ob.'This is one' // SyntaxError
ob['This is one'] // 1
Der Eigenschaftsname ist einer Variablen zugewiesen und Sie möchten über diese Variable auf den Eigenschaftswert zugreifen.
var ob = {
'One': 1,
'Seven': 7,
}
var _Seven = 'Seven';
ob._Seven // undefined
ob[_Seven] // 7
9864200cookie-checkZugriff auf JavaScript-Eigenschaften: Punktnotation vs. Klammern?yes
Nur um einzugreifen, keine Antwort auf Ihre ursprüngliche Frage (da Sie bisher viele gute Erklärungen hatten), aber in Bezug auf die Geschwindigkeit gibt es auch keinen erwähnenswerten Unterschied: jsperf.com/dot-vs-square-brackets. Der obige Test gibt jedem von ihnen bestenfalls nur eine Marge von 2%, sie sind gleichauf.
– unwissentlich
4. September 2013 um 15:25 Uhr
Siehe auch Wie füge ich eine Eigenschaft zu einem Objekt hinzu, indem ich eine Variable als Namen verwende? und Dynamischer Zugriff auf Objekteigenschaft unter Verwendung einer Variablen
– Bergi
18. November 2014 um 6:12 Uhr
Diese Frage/Antwort kann auch für UTF-8-Schlüssel verwendet werden.
– Peter Krauß
2. März 2019 um 6:09 Uhr