Il codice JavaScript è unico nel modo in cui tratta l'accesso alle proprietà mancanti?

0

Javascript ha il comportamento in cui non viene generato un errore sull'assenza di accesso alle proprietà sugli oggetti, che è la causa di molti bug perniciosi:

console.log("iPhone".missingProperty) // undefined

Mi chiedo se questo comportamento sia particolarmente anormale per i linguaggi di programmazione. Come il seguente, esploderà in Ruby:

puts "iphone".missingProperty

Così come il seguente in Python:

print("iphone".missingElement)

Questa è una di quelle stranezze di Javascript che sono il risultato del suo frettoloso sviluppo, o c'era un ragionamento dietro questo comportamento?

    
posta jumbopap 17.09.2018 - 01:17
fonte

1 risposta

3

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:

risposta data 17.09.2018 - 11:51
fonte

Leggi altre domande sui tag