JavaScript è abbastanza unico in quanto gli oggetti sono letteralmente dettt / hash-tables. Non c'è differenza tra un accesso di proprietà tramite notazione punto object.field
o notazione parentesi object['field']
. Questa sintassi viene definita come sempre restituendo un valore di riferimento anche se tale voce non esiste e questo valore potrebbe essere undefined
.
Per le tabelle hash in varie lingue, c'è una grande differenza nel fatto che l'accesso a una chiave mancante restituisca un valore predefinito o sollevi un'eccezione. Per esempio. in Perl $hash{$key}
restituirà undef
sulle chiavi mancanti. Altre lingue supportano sia il lancio che gli accessi ai valori predefiniti:
- In C ++,
map[key]
creerà una voce con un valore predefinito, mentre map.at(key)
genererà un'eccezione
- In Python,
dict[key]
genererà un KeyError, ma dict.get(key)
restituirà None
.
JavaScript usa lo stesso approccio come in Perl che le voci mancanti restituiscono un valore speciale. Questo approccio ha il vantaggio pratico che può utilizzare lo stesso macchinario per lvalue e rvalue. Nei linguaggi di programmazione, un lvalue descrive qualcosa che può essere assegnato a (ad esempio variabili). Il lato sinistro di un compito lvalue = rvalue
deve essere un lvalue, ovvero un obiettivo di assegnazione valido.
Il valore di ritorno di un accesso di proprietà in JavaScript è esattamente tale valore (che chiama Reference). Questo riferimento memorizza l'oggetto base e il nome della proprietà. Se il riferimento viene utilizzato come valore di rvalue per accedere al valore racchiuso, viene restituito il valore della proprietà o undefined. Ma se il riferimento è usato come un lvalue (target di assegnazione), allora una nuova voce con il nome dato può essere creata nell'oggetto di base. Questo è descritto come l'operazione astratta PutValue
in 6.2.3.2.
Si noti che questo descrive la macchina virtuale JavaScript astratta nello standard. Una vera implementazione ottimizzerà quei passi e in realtà non creerà un valore Reference
. Di conseguenza, tali riferimenti non possono essere passati (a differenza, ad esempio, in C ++ e in una certa misura in Perl).
Vedi anche: