Abgesehen von der offensichtlichen Tatsache, dass das erste Formular eine Variable und nicht nur ein Zeichenfolgenliteral verwenden könnte, gibt es einen Grund, eine übereinander 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 vorzuziehen ist.
javascript
syntax
object-literal
Mark Renouf
quelle
quelle
Antworten:
(Von hier bezogen .)
Die eckige Klammernotation ermöglicht die Verwendung von Zeichen, die mit der Punktnotation nicht verwendet werden können:
einschließlich Nicht-ASCII-Zeichen (UTF-8) wie in
myForm["ダ"]
( weitere Beispiele ).Zweitens ist die eckige Klammer nützlich, wenn Sie mit Eigenschaftsnamen arbeiten, die auf vorhersehbare Weise variieren:
Zusammenfassen:
Ein weiteres Beispiel für Zeichen, die nicht mit der Punktnotation verwendet werden können, sind Eigenschaftsnamen, die selbst einen Punkt enthalten .
Beispielsweise könnte eine JSON-Antwort eine Eigenschaft enthalten, die aufgerufen wird
bar.Baz
.quelle
Mit der Klammernotation können Sie auf Eigenschaften nach Namen zugreifen, die in einer Variablen gespeichert sind:
obj.x
würde in diesem Fall nicht funktionieren.quelle
Die beiden häufigsten Möglichkeiten, auf Eigenschaften in JavaScript zuzugreifen, sind ein Punkt und eckige Klammern. Beide
value.x and value[x]
greifen auf eine Eigenschaft nach Wert zu - aber nicht unbedingt auf dieselbe Eigenschaft. Der Unterschied besteht darin, wie x interpretiert wird. Bei Verwendung eines Punkts muss der Teil nach dem Punkt ein gültiger Variablenname sein und die Eigenschaft direkt benennen. Bei Verwendung von eckigen Klammern wird der Ausdruck zwischen den Klammern ausgewertet, um den Eigenschaftsnamen zu erhalten. Während value.x die Eigenschaft des Werts "x" abruft, versucht value [x], den Ausdruck x auszuwerten, und verwendet das Ergebnis als Eigenschaftsnamen.Wenn Sie also wissen, dass die Immobilie, an der Sie interessiert sind, "Länge" heißt, sagen Sie
value.length
. Wenn Sie die Eigenschaft extrahieren möchten, die durch den in der Variablen enthaltenen Wert benannt isti
, sagen Sievalue[i]
. Und da Eigenschaftsnamen eine beliebige Zeichenfolge sein können, müssen Sie eckige Klammern verwenden , wenn Sie auf eine Eigenschaft mit dem Namen“2”
oder zugreifen möchten“John Doe”
:value[2] or value["John Doe"]
. Dies ist der Fall, obwohl Sie den genauen Namen der Eigenschaft im Voraus kennen, da keiner der beiden“2” nor “John Doe”
einen gültigen Variablennamen hat und daher nicht über die Punktnotation zugegriffen werden kann.Im Falle von Arrays
Die Elemente in einem Array werden in Eigenschaften gespeichert. Da die Namen dieser Eigenschaften Zahlen sind und wir häufig ihren Namen von einer Variablen erhalten müssen, müssen wir die Klammer-Syntax verwenden, um auf sie zuzugreifen. Die Länge-Eigenschaft eines Arrays gibt an, wie viele Elemente es enthält. Dieser Eigenschaftsname ist ein gültiger Variablenname, und wir kennen seinen Namen im Voraus. Um die Länge eines Arrays zu ermitteln, schreiben Sie normalerweise,
array.length
da dies einfacher zu schreiben ist alsarray["length"]
.quelle
The elements in an array are stored in properties
das verwirrt mich. Was meinst du mit in Eigenschaften gespeichert? Was sind Eigenschaften? Nach meinem Verständnis ist Array nur eine Reihe von Werten ohne Eigenschaften. Wenn sie in Eigenschaften gespeichert sind, warum ist es dann keinproperty: value
/ assoziatives Array?Die Punktnotation funktioniert bei einigen Schlüsselwörtern (wie
new
undclass
) im Internet Explorer 8 nicht.Ich hatte diesen Code:
Und dies löst den gefürchteten "erwarteten Indentifier" aus (zumindest unter IE8 unter Windows XP habe ich keine anderen Umgebungen ausprobiert). Die einfache Lösung dafür besteht darin, zur Klammer-Notation zu wechseln:
quelle
Seien Sie vorsichtig, wenn Sie diese Notationen verwenden: Zum Beispiel. wenn wir auf eine Funktion zugreifen möchten, die im übergeordneten Fenster eines Fensters vorhanden ist. Im IE:
ist nicht gleichbedeutend mit
Wir können entweder verwenden:
oder
um darauf zuzugreifen
quelle
Im Allgemeinen machen sie den gleichen Job.
Trotzdem gibt Ihnen die Klammernotation die Möglichkeit, Dinge zu tun, die Sie mit der Punktnotation nicht machen können, wie z
Dies kann auf jede Eigenschaft erweitert werden, die Sonderzeichen enthält.
quelle
Sie müssen Klammern verwenden, wenn die Eigenschaftsnamen Sonderzeichen enthalten:
Davon abgesehen ist es wohl nur Geschmackssache. IMHO ist die Punktnotation kürzer und es wird deutlicher, dass es sich eher um eine Eigenschaft als um ein Array-Element handelt (obwohl JavaScript natürlich sowieso keine assoziativen Arrays hat).
quelle
Die Klammernotation kann Variablen verwenden, daher ist sie in zwei Fällen nützlich, in denen die Punktnotation nicht funktioniert:
1) Wenn die Eigenschaftsnamen dynamisch ermittelt werden (wenn die genauen Namen erst zur Laufzeit bekannt sind).
2) Wenn Sie eine for..in-Schleife verwenden, um alle Eigenschaften eines Objekts zu durchlaufen.
Quelle: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects
quelle
Sie müssen die eckige Klammer verwenden, wenn -
Der Eigenschaftsname ist Nummer.
Der Eigenschaftsname hat ein Sonderzeichen.
Der Eigenschaftsname wird einer Variablen zugewiesen, und Sie möchten über diese Variable auf den Eigenschaftswert zugreifen.
quelle
Fall, in dem die
[]
Notation hilfreich ist:Wenn Ihr Objekt dynamisch ist und einige zufällige Werte in Schlüsseln wie
number
und[]
oder einem anderen Sonderzeichen vorhanden sein können, z.var a = { 1 : 3 };
Wenn Sie nun versuchen, wie
a.1
in einem Fehler darauf zuzugreifen , weil dort eine Zeichenfolge erwartet wird.quelle
Punktnotation ist immer vorzuziehen. Wenn Sie eine "intelligentere" IDE oder einen Texteditor verwenden, werden undefinierte Namen von diesem Objekt angezeigt. Verwenden Sie die Notation in Klammern nur, wenn Sie den Namen mit ähnlichen Strichen oder ähnlichem ungültig haben. Und auch, wenn der Name in einer Variablen gespeichert ist.
quelle
Math.sqrt(25)
, aber nichtMath['sqrt'](25)
.Lassen Sie mich noch einen Anwendungsfall der eckigen Klammer hinzufügen. Wenn Sie beispielsweise
x-proxy
in einem Objekt auf eine Eigenschaft zugreifen möchten ,-
wird dies falsch interpretiert. Es gibt auch einige andere Fälle wie Leerzeichen, Punkte usw., in denen die Punktoperation Ihnen nicht hilft. Auch wenn Sie den Schlüssel in einer Variablen haben, können Sie nur in Klammernotation auf den Wert des Schlüssels in einem Objekt zugreifen. Hoffe du bekommst mehr Kontext.quelle
Ein Beispiel, bei dem die Punktnotation fehlschlägt
quelle