Zugriff auf JavaScript-Eigenschaften: Punktnotation vs. Klammern?

394

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.

Mark Renouf
quelle
3
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 ergibt für jeden von ihnen höchstens eine Marge von 2%, sie sind Hals an Hals.
unwissentlich
Diese Frage / Antwort kann auch für UTF-8-Schlüssel verwendet werden.
Peter Krauss

Antworten:

422

(Von hier bezogen .)

Die eckige Klammernotation ermöglicht die Verwendung von Zeichen, die mit der Punktnotation nicht 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["ダ"]( weitere Beispiele ).

Zweitens ist die eckige Klammer nützlich, wenn Sie mit Eigenschaftsnamen arbeiten, 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 eckige Klammer ermöglicht den Zugriff auf Eigenschaften mit Sonderzeichen und die Auswahl von Eigenschaften mithilfe von Variablen

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.

var foo = myResponse.bar.Baz; // incorrect syntax
var foo = myResponse["bar.Baz"]; // correct syntax
Aron Rotteveel
quelle
45
Die Codebeispiele und der Wortlaut der Zusammenfassung kommen mir sehr bekannt vor. dev-archive.net/articles/js-dot-notation
Quentin
61
Keine Notwendigkeit, das Rad neu zu erfinden, oder? Zitieren als Referenz.
Aron Rotteveel
13
Punktnotation ist schneller (zumindest für mich) Testen Sie Ihren Browser jsperf.com/dot-notation-vs-bracket-notation/2
Dave Chen
4
in Chrom 44 auf meiner Maschinenhalterung Notation ist schneller
Austin Frankreich
2
@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 Punktnotation tun.
Abdul
104

Mit der Klammernotation können Sie auf Eigenschaften nach Namen zugreifen, 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.

Naiquevin
quelle
12

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 ist i, sagen Sie value[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.lengthda dies einfacher zu schreiben ist als array["length"].

Sagar Munjal
quelle
Könnten Sie näher auf array.length eingehen? Sie sagen, dass Eigenschaften, auf die über die Punktnotation zugegriffen wird, nicht ausgewertet werden. Geben Sie im Fall von array.length nicht die Zeichenfolge "length" anstelle des ausgewerteten Werts an, in diesem Fall die Anzahl der Elemente im Array? The elements in an array are stored in propertiesdas 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 kein property: value/ assoziatives Array?
Limpuls
Diese Antwort ist besonders wertvoll, weil sie den Unterschied zwischen den beiden Notationen erklärt.
Schachnetz
11

Die Punktnotation funktioniert bei einigen Schlüsselwörtern (wie newund class) im Internet Explorer 8 nicht.

Ich hatte diesen Code:

//app.users is a hash
app.users.new = {
  // some 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:

app.users['new'] = {
  // some code
}
Benjamin Crouzier
quelle
Hilfreiche Antwort. Vielen Dank.
Ilyas Karim
Arbeitet auf Chrom 2019 res.cloudinary.com/rootworld/image/upload/v1567651133/js.png
Phani Rithvij
8

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:

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

user2593104
quelle
6

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

var x = elem["foo[]"]; // can't do elem.foo[];

Dies kann auf jede Eigenschaft erweitert werden, die Sonderzeichen enthält.

CdB
quelle
5

Sie müssen Klammern verwenden, wenn die Eigenschaftsnamen Sonderzeichen enthalten:

var foo = {
    "Hello, world!": true,
}
foo["Hello, world!"] = false;

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

Álvaro González
quelle
3

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

Lev Stefanovich
quelle
3

Sie müssen die eckige Klammer verwenden, wenn -

  1. Der Eigenschaftsname ist Nummer.

    var ob = {
      1: 'One',
      7 : 'Seven'
    }
    ob.7  // SyntaxError
    ob[7] // "Seven"
  2. Der Eigenschaftsname hat ein Sonderzeichen.

    var ob = {
      'This is one': 1,
      'This is seven': 7,
    }  
    ob.'This is one'  // SyntaxError
    ob['This is one'] // 1
  3. Der Eigenschaftsname wird 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
Harunur Rashid
quelle
1

Fall, in dem die []Notation hilfreich ist:

Wenn Ihr Objekt dynamisch ist und einige zufällige Werte in Schlüsseln wie numberund []oder einem anderen Sonderzeichen vorhanden sein können, z.

var a = { 1 : 3 };

Wenn Sie nun versuchen, wie a.1in einem Fehler darauf zuzugreifen , weil dort eine Zeichenfolge erwartet wird.

Anshul
quelle
1

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.

Dušan Novák
quelle
Und es gibt auch Situationen, in denen die Klammernotation überhaupt nicht zulässig ist, selbst wenn Sie keine Bindestriche haben. Zum Beispiel können Sie schreiben Math.sqrt(25), aber nicht Math['sqrt'](25).
Herr Lister
0

Lassen Sie mich noch einen Anwendungsfall der eckigen Klammer hinzufügen. Wenn Sie beispielsweise x-proxyin 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.

Manish Waran
quelle
0

Ein Beispiel, bei dem die Punktnotation fehlschlägt

json = { 
   "value:":4,
   'help"':2,
   "hello'":32,
   "data+":2,
   "😎":'😴',
   "a[]":[ 
      2,
      2
   ]
};

// correct
console.log(json['value:']);
console.log(json['help"']);
console.log(json["help\""]);
console.log(json['hello\'']);
console.log(json["hello'"]);
console.log(json["data+"]);
console.log(json["😎"]);
console.log(json["a[]"]);

// wrong
console.log(json.value:);
console.log(json.help");
console.log(json.hello');
console.log(json.data+);
console.log(json.😎);
console.log(json.a[]);

Die Eigenschaftsnamen sollten die Syntaxregeln von Javascript nicht beeinträchtigen, damit Sie als auf sie zugreifen können json.property_name

Phani Rithvij
quelle