2015-04-08 9 views
7

Letztes Mal habe ich geprüft, die beiden folgenden Zeilen zurück true:Warum ist localStorage ["..."] undefiniert, aber localStorage.getItem ("...") ist null?

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

Gleiches gilt, wenn null mit undefined ersetzen. Also die erste Frage ist, warum gibt es zwei Möglichkeiten, die localStorage zu adressieren? Und warum tut

localStorage["foo"] 

Rückkehr undefined während

localStorage.getItem("foo") 

kehrt null?

Muss ich bei der Entwicklung von JS darauf achten?

+0

Ah, die Freuden von Javascript. –

+1

@RobertHarvey die Sprache ist in Ordnung, es sind die Implementierungsvarianten, die es töten :( – Alnitak

+1

Natürlich, ob es 'undefined' oder' null' zurückgibt, du wirst immer noch damit umgehen müssen.Warum nicht einfach nach beiden suchen? Siehe auch http://programmers.stackexchange.com/a/268125 –

Antwort

5

Die Web Storage Specification requires, die .getItem()null für einen unbekannten Schlüssel zurückgibt.

ist jedoch zu beachten, dass .getItem() und .setItem() speziell in der IDL definiert sind, die als getter und setter für die Storage Schnittstelle bezeichnet, und deshalb sind sie auch voll Weise unterstützen den Inhalt des Speichers zuzugreifen.

Die Syntax [] ist jedoch eher mit einem normalen Objekt- und/oder Array-Eigenschaftengetter vergleichbar und gibt undefined für einen unbekannten Eigenschaftsnamen zurück.

Der Grund nicht[] Syntax zu verwenden ist, dass es zunächst auf Objekteigenschaften arbeiten und wird ganz glücklich können Sie echte Eigenschaften und Methoden des localStorage Objekt, cf zu überschreiben:

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

Gilt die letzte Aussage zum Überschreiben von "echten" localStorage-Eigenschaften? Ab heute war ich nicht in der Lage dies zu reproduzieren (in Firefox Developer Edition). Die Ausführung Ihres Codes gibt mir '" function() {return 0} "'. – jaySon

+0

@jaySon Auf dem aktuellen Chrome (51.0.2704.79) gibt es immer noch Null zurück. – Alnitak

+0

@jaySon und immer noch das gleiche mit Chrome 55.0.2883.95 – Alnitak

2

localStorage["..."] ist ungültige Verwendung von Localstorage. Sie versuchen, auf Methoden des Objekts localstorage zuzugreifen, anstatt auf die tatsächliche Datenbank zuzugreifen.

Sie haben

localStorage.getItem("...") 

und

localStorage.setItem("...") 

Methoden verwenden Speicherdatenbank zuzugreifen.

+0

Ah, richtig. Das macht Sinn. –

+1

Aber Sie können beide Syntaxen "cross-use". Einstellungen, die 'setItem()' verwenden und mit '[]' abgerufen werden, funktionieren genauso gut wie umgekehrt. – jaySon

+2

tatsächlich - auf meinem Chrome (41?) Erscheinen die aktuellen Schlüssel alle in 'Object.keys (localStorage)'. Das '.getItem' ist eindeutig sicherer, aber es ist schwer zu behaupten, dass die' [] 'Methode _invalid_ ist. – Alnitak

1

in JavaScript Sie erhalten immer einen undefined Wert für Schlüssel, die nicht in einem Objekt vorhanden sind.

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

In local .getItem ist eine Methode, die das Objekt localstorage überprüft Schlüssel innen und gibt null wenn nicht gefunden.

Tadeln Sie Javascript nicht, es ist nur das Objekt local Verhalten