2015-04-08 13 views
7

L'ultima volta che ho controllato, le seguenti due righe restituito true:Perché localStorage ["..."] non definito, ma localStorage.getItem ("...") è null?

null == localStorage["foo"]; 
null == localStorage.getItem("foo"); 

Lo stesso vale in caso di sostituzione null con undefined. Quindi la prima domanda è, perché ci sono due modi per rivolgersi a localStorage? E perché

localStorage["foo"] 

ritorno undefined mentre

localStorage.getItem("foo") 

rendimenti null?

Devo occuparmene durante lo sviluppo di JS?

+0

Ah, le gioie di Javascript. –

+1

@RobertHarvey il linguaggio va bene, sono le varianti di implementazione che lo uccidono :( – Alnitak

+1

Naturalmente, se restituisce 'undefined' o' null', hai ancora a che fare con esso.Perché non controllare solo per entrambi? Vedi anche http://programmers.stackexchange.com/a/268125 –

risposta

5

Il Web Storage Specification requires che .getItem() restituisce null per una chiave sconosciuta.

nota tuttavia che .getItem() e .setItem() sono specificamente definiti nella IDL come il designato getter e setter per l'interfaccia Storage, e quindi sono anche pienamente modi di accedere ai contenuti dell'archivio supportato.

Tuttavia, la sintassi [] è più simile a un oggetto normale e/o al getter di proprietà di matrice e, analogamente, restituisce undefined per un nome di proprietà sconosciuto.

Il motivo non utilizzare [] la sintassi è che opererà sulle proprietà degli oggetti prima e sarà tranquillamente permetterà di sovrascrivere le proprietà e metodi della localStorage oggetto, CF reali:

> localStorage['getItem'] = function() { return 0 } 
> localStorage.getItem('getItem') 
0 
+0

L'ultima istruzione relativa alla sovrascrittura delle proprietà localStorage "reali" si applica ancora? A partire da oggi, non ero in grado di riprodurlo (in Firefox Developer Edition). L'esecuzione del tuo codice mi dà '" function() {return 0} "'. – jaySon

+0

@jaySon Su Chrome corrente (51.0.2704.79) restituisce ancora zero. – Alnitak

+0

@jaySon e ancora lo stesso con Chrome 55.0.2883.95 – Alnitak

2

localStorage["..."] non è valido l'utilizzo di localstorage. Stai tentando di accedere ai metodi dell'oggetto localstorage anziché accedere al database effettivo.

devi usare

localStorage.getItem("...") 

e

localStorage.setItem("...") 

metodi per accedere al database di archiviazione.

+0

Ah, giusto. Ciò ha senso. –

+1

Ma è possibile "cross use" entrambe le sintassi. Impostazioni qualcosa usando 'setItem()' e ottenerlo usando '[]' funziona altrettanto bene come il contrario. – jaySon

+2

infatti - sul mio Chrome (41?) I tasti attuali appaiono tutti in 'Object.keys (localStorage)'. '.getItem' è chiaramente più sicuro, ma è difficile affermare che il metodo' [] 'è _invalid_. – Alnitak

1

in Javascript ottieni sempre un valore undefined per le chiavi che non esistono all'interno di un oggetto.

a = {}; //new object 
alert(a["test"]); // you get 'undefined' because "test" keys is not found 

In localStorage .getItem è un metodo che fa i tasti di controllo all'interno dell'oggetto localStorage e restituisce null se non trovato.

Non prendetevela con javascript, è solo il comportamento oggetto localStorage