Perché una WeakMap ES2015 non può avere chiavi primitive?

2

Ci sono sei tipi di dati primitivi in JavaScript:

Boolean, Number, String, Symbol, undefined, null

Un WeakMap non può avere tipi di dati primitivi come chiavi. E un WeakSet non può avere valori primitivi.

Perché è questo? È una decisione di progettazione del linguaggio (nel qual caso, che cosa ha spinto questo?) Oppure esiste una ragione fondamentale per cui i primitivi non possono essere archiviati debolmente? Sento che probabilmente è il secondo, ma non sono sicuro del perché.

    
posta callum 08.07.2016 - 12:21
fonte

1 risposta

1

Perché è probabile che le implementazioni del linguaggio utilizzino tipi primitivi come tipi valore piuttosto che tipi riferimento . Cioè, quando assegni un valore a una nuova variabile, piuttosto che modificare la variabile in modo tale che a contiene un riferimento allo stesso oggetto utilizzato nell'espressione sorgente, potrebbe copiare il valore di quell'oggetto nella variabile (se conosci C # , pensa al diverso tra struct e class ). Un tale valore quindi non potrebbe essere usato sensibilmente come parte di un debole sistema di riferimento, poiché non vi è alcun oggetto da raccogliere (solo valori che vengono copiati) e quindi la rimozione della chiave debole non si innescherà mai.

L'uso di valori piuttosto che riferimenti per questi tipi di dati comuni è un'ottimizzazione che può produrre sostanziali miglioramenti delle prestazioni, e quindi gli sviluppatori di ECMAscript avrebbero dovuto evitare di aggiungere funzionalità che non potevano essere utilizzate.

Se hai bisogno di usare un oggetto del genere, puoi semplicemente creare un oggetto contenitore (solitamente chiamato "scatola") per mantenere il valore e permetterne l'uso in contesti in cui sono consentiti solo riferimenti.

    
risposta data 08.07.2016 - 12:38
fonte

Leggi altre domande sui tag