Accesso alle proprietà JavaScript: notazione punto vs parentesi?


394

A parte il fatto ovvio che la prima forma potrebbe usare una variabile e non solo una stringa letterale, c'è qualche motivo per usarne una rispetto all'altra, e in tal caso in quali casi?

Nel codice:

// Given:
var foo = {'bar': 'baz'};

// Then
var x = foo['bar'];

// vs. 
var x = foo.bar;

Contesto: ho scritto un generatore di codice che produce queste espressioni e mi chiedo quale sia preferibile.


3
Solo per aggiungere, non una risposta alla tua domanda originale (dal momento che hai avuto molte buone spiegazioni finora), ma per quanto riguarda la velocità non c'è alcuna differenza da menzionare: jsperf.com/dot-vs-square-brackets . Il test di cui sopra dà solo un margine del 2% al massimo per uno di loro, sono collo e collo.
inconsapevole il


Questa domanda / risposta può essere utilizzata anche per i tasti UTF-8.
Peter Krauss,

Risposte:


422

(Proveniente da qui .)

La notazione a parentesi quadra consente l'uso di caratteri che non possono essere utilizzati con la notazione a punti:

var foo = myForm.foo[]; // incorrect syntax
var foo = myForm["foo[]"]; // correct syntax

compresi i caratteri non ASCII (UTF-8), come in myForm["ダ"]( altri esempi ).

In secondo luogo, la notazione tra parentesi quadre è utile quando si hanno a che fare con nomi di proprietà che variano in modo prevedibile:

for (var i = 0; i < 10; i++) {
  someFunction(myForm["myControlNumber" + i]);
}

Arrotondare:

  • La notazione a punti è più veloce da scrivere e più chiara da leggere.
  • La notazione con parentesi quadra consente l'accesso a proprietà contenenti caratteri speciali e la selezione di proprietà mediante variabili

Un altro esempio di caratteri che non possono essere utilizzati con la notazione punto sono i nomi delle proprietà che a loro volta contengono un punto .

Ad esempio una risposta json potrebbe contenere una proprietà chiamata bar.Baz.

var foo = myResponse.bar.Baz; // incorrect syntax
var foo = myResponse["bar.Baz"]; // correct syntax

45
Gli esempi di codice e la formulazione del riassunto sembrano terribilmente familiari. dev-archive.net/articles/js-dot-notation
Quentin

61
Non c'è bisogno di reinventare la ruota, vero? Citandolo come riferimento.
Aron Rotteveel,

13
La notazione dei punti è più veloce (almeno per me) testare il browser jsperf.com/dot-notation-vs-bracket-notation/2
Dave Chen

4
in chrome 44 sulla mia notazione di parentesi macchina è più veloce
Austin France

2
@chenghuayang Quando si desidera accedere a una proprietà di un oggetto la cui chiave è memorizzata in una variabile, non è possibile con la notazione punto.
Abdul,

105

La notazione di parentesi quadra consente di accedere alle proprietà per nome memorizzate in una variabile:

var obj = { "abc" : "hello" };
var x = "abc";
var y = obj[x];
console.log(y); //output - hello

obj.x non funzionerebbe in questo caso.


12

I due modi più comuni per accedere alle proprietà in JavaScript sono con un punto e tra parentesi quadre. Entrambi value.x and value[x]accedono a una proprietà in base al valore, ma non necessariamente alla stessa proprietà. La differenza sta nel modo in cui x viene interpretato. Quando si utilizza un punto, la parte dopo il punto deve essere un nome di variabile valido e assegna direttamente un nome alla proprietà. Quando si usano parentesi quadre, l'espressione tra parentesi viene valutata per ottenere il nome della proprietà. Mentre value.x recupera la proprietà del valore denominato "x", value [x] tenta di valutare l'espressione x e utilizza il risultato come nome della proprietà.

Quindi, se sai che la proprietà che ti interessa si chiama "lunghezza", dici value.length. Se vuoi estrarre la proprietà chiamata dal valore contenuto nella variabile i, dici value[i]. E poiché i nomi delle proprietà può essere qualsiasi stringa, se si desidera accedere a una proprietà denominata “2”o “John Doe”, è necessario utilizzare le parentesi quadre: value[2] or value["John Doe"]. Questo è il caso anche se si conosce in anticipo il nome preciso della proprietà, poiché nessuno dei due “2” nor “John Doe”è un nome di variabile valido e pertanto non è possibile accedervi tramite la notazione a punti.

In caso di array

Gli elementi in un array sono memorizzati in proprietà. Poiché i nomi di queste proprietà sono numeri e spesso dobbiamo ottenere il loro nome da una variabile, per accedervi dobbiamo usare la sintassi del bracketing. La proprietà length di un array ci dice quanti elementi contiene. Questo nome di proprietà è un nome di variabile valido e ne conosciamo il nome in anticipo, quindi per trovare la lunghezza di un array, in genere si scrive array.lengthperché è più facile da scrivere rispetto a array["length"].


Potresti approfondire di più su array.length? Dici che le proprietà a cui si accede con la notazione punto non vengono valutate, quindi in caso di array.length non ci darebbe una stringa "lunghezza" invece del valore valutato, in questo caso il numero di elementi nell'array? The elements in an array are stored in propertiesquesto è ciò che mi confonde. Cosa intendi per "immagazzinato" nelle proprietà? Quali sono le proprietà? Nella mia comprensione array è solo un mucchio di valori senza proprietà. Se sono memorizzati in proprietà, come mai non è property: value/ array associativo?
Limpuls,

Questa risposta è particolarmente preziosa perché spiega la differenza tra le due notazioni.
chessweb

11

La notazione a punti non funziona con alcune parole chiave (come newe class) in Internet Explorer 8.

Ho avuto questo codice:

//app.users is a hash
app.users.new = {
  // some code
}

E questo innesca il temuto "indentificatore previsto" (almeno su IE8 su Windows XP, non ho provato altri ambienti). La soluzione semplice è quella di passare alla notazione parentesi:

app.users['new'] = {
  // some code
}

Risposta utile. Grazie.
Ilyas karim,


8

Fai attenzione quando usi queste notazioni: ad es. se vogliamo accedere a una funzione presente nel genitore di una finestra. In IE:

window['parent']['func']

non è equivalente a

window.['parent.func']

Possiamo usare:

window['parent']['func'] 

o

window.parent.func 

per accedervi


6

In generale, fanno lo stesso lavoro.
Tuttavia, la notazione tra parentesi ti dà l'opportunità di fare cose che non puoi fare con la notazione punto, come

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

Questo può essere esteso a qualsiasi proprietà contenente caratteri speciali.


5

È necessario utilizzare le parentesi se i nomi delle proprietà hanno caratteri speciali:

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

A parte questo, suppongo sia solo una questione di gusti. IMHO, la notazione dei punti è più breve e rende più ovvio che si tratta di una proprietà piuttosto che di un elemento array (anche se ovviamente JavaScript non ha comunque array associativi).


4

Devi usare la notazione parentesi quadra quando -

  1. Il nome della proprietà è numero.

    var ob = {
      1: 'One',
      7 : 'Seven'
    }
    ob.7  // SyntaxError
    ob[7] // "Seven"
  2. Il nome della proprietà ha un carattere speciale.

    var ob = {
      'This is one': 1,
      'This is seven': 7,
    }  
    ob.'This is one'  // SyntaxError
    ob['This is one'] // 1
  3. Il nome della proprietà è assegnato a una variabile e si desidera accedere al valore della proprietà da questa variabile.

    var ob = {
      'One': 1,
      'Seven': 7,
    }
    
    var _Seven = 'Seven';
    ob._Seven  // undefined
    ob[_Seven] // 7


1

Caso in cui la []notazione è utile:

Se il tuo oggetto è dinamico e potrebbero esserci dei valori casuali in chiavi come numbere []o in qualsiasi altro carattere speciale, ad esempio -

var a = { 1 : 3 };

Ora, se provi ad accedere come a.1farebbe attraverso un errore, perché si aspetta una stringa laggiù.


1

La notazione a punti è sempre preferibile. Se stai usando un IDE "più intelligente" o un editor di testo, mostrerà nomi non definiti da quell'oggetto. Usa la notazione tra parentesi solo quando hai il nome con trattini simili o qualcosa di simile non valido. E anche se il nome è memorizzato in una variabile.


E ci sono anche situazioni in cui la notazione tra parentesi non è affatto consentita, anche se non hai trattini. Ad esempio, puoi scrivere Math.sqrt(25), ma non Math['sqrt'](25).
Lister

0

Vorrei aggiungere qualche altro caso d'uso della notazione parentesi quadra. Se si desidera accedere a una proprietà, dire x-proxyin un oggetto, quindi -verrà interpretato in modo errato. Ci sono anche altri casi come spazio, punto, ecc., In cui l'operazione punto non ti aiuterà. Inoltre, se hai la chiave in una variabile, l'unico modo per accedere al valore della chiave in un oggetto è la notazione tra parentesi. Spero che tu abbia un po 'più di contesto.


0

Un esempio in cui la notazione punto non riesce

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[]);

I nomi delle proprietà non dovrebbero interferire con le regole di sintassi di javascript affinché tu possa accedervi come json.property_name

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.