Ich habe kürzlich eine Frage zu LocalStorage gestellt . Verwenden JSON.parse(localStorage.item)
und JSON.parse(localStorage['item'])
arbeiteten nicht, um zurückzukehren, NULL
wenn der Artikel noch nicht eingestellt war.
Hat JSON.parse(localStorage.getItem('item')
aber funktioniert. Und es stellt sich heraus, JSON.parse(localStorage.testObject || null)
funktioniert auch.
Einer der Kommentare sagte im Grunde, dass localStorage.getItem()
und localStorage.setItem()
sollte immer bevorzugt werden:
Der Getter und der Setter bieten eine konsistente, standardisierte und Crossbrowser-kompatible Möglichkeit, mit der LS-API zu arbeiten, und sollten immer den anderen Methoden vorgezogen werden. - Christoph
Ich mag es, die Kurz- und Klammernotationen für localStorage zu verwenden, aber ich bin gespannt, wie andere dies angehen. Ist localStorage.getItem ('item') besser als localStorage.item oder localStorage ['item'] ODER sind die Kurzschreibweisen in Ordnung, solange sie funktionieren?
quelle
getItem
undsetItem
sind die standardisierte Art, Dinge zu tun.getItem
/setItem
Methoden. Ich werde die technischen Daten später noch einmal lesen, aber die einzige ausfallsichere Möglichkeit, Ihre Frage zu beantworten, besteht darin, sie während aller Tests in allen gängigen Browsern zu testen.localStorage.item
standardisiert?getItem
/ zu verwenden,setItem
da diese Methoden nicht mit den vorhandenen Eigenschaften deslocalStorage
Objekts in Konflikt stehen . Beispiel: FunktioniertlocalStorage.setItem('getItem', 'blah'); console.log(localStorage.getItem('getItem'));
, währendlocalStorage.getItem = 'blah';
diegetItem
Methode von localStorage überschrieben wird. jsfiddle.net/DrquYAntworten:
Sowohl der direkte Zugriff auf Eigenschaften (
localStorage.item
oderlocalStorage['item']
) als auch die Verwendung der Funktionsschnittstelle (localStorage.getItem('item')
) funktionieren einwandfrei. Beide sind Standard- und browserübergreifend kompatibel. * Gemäß der Spezifikation :Sie verhalten sich nur anders, wenn kein Schlüssel / Wert-Paar mit dem angeforderten Namen gefunden wird. Zum Beispiel, wenn Schlüssel
'item'
nicht vorhanden ist ,var a = localStorage.item;
wird in Folgea
seinundefined
, währendvar a = localStorage.getItem('item');
in Folge wirda
mit dem Wertnull
. Wie Sie festgestellt habenundefined
undnull
in JavaScript / EcmaScript nicht austauschbar sind. :) :)BEARBEITEN: Wie Christoph in seiner Antwort hervorhebt , ist die funktionale Schnittstelle die einzige Möglichkeit, Werte unter Schlüsseln, die den vordefinierten Eigenschaften von entsprechen, zuverlässig zu speichern und abzurufen
localStorage
. (Es gibt sechs davon:length
,key
,setItem
,getItem
,removeItem
, undclear
.) So zum Beispiel der folgende wird immer funktionieren:Beachten Sie insbesondere , dass die erste Aussage wird die Eigenschaft nicht beeinflussen
localStorage.length
(außer vielleicht es erhöht wird, wenn kein Schlüssel ist'length'
bereits inlocalStorage
). In dieser Hinsicht scheint die Spezifikation intern inkonsistent zu sein.Folgendes wird jedoch wahrscheinlich nicht das tun, was Sie wollen:
Interessanterweise ist das erste ein No-Op in Chrome, aber es ist gleichbedeutend mit dem Funktionsaufruf in Firefox. Der zweite protokolliert immer die Anzahl der vorhandenen Schlüssel
localStorage
.* Dies gilt für Browser, die in erster Linie Webspeicher unterstützen. (Dies schließt so ziemlich alle modernen Desktop- und mobilen Browser ein.) In Umgebungen, in denen lokaler Speicher mithilfe von Cookies oder anderen Techniken simuliert wird, hängt das Verhalten von der verwendeten Shim ab. Mehrere polyfills für
localStorage
finden sich hier .quelle
Die Frage ist schon ziemlich alt, aber da ich in der Frage zitiert wurde, denke ich, ich sollte zwei Worte über meine Aussage sagen.
Das Speicherobjekt ist etwas Besonderes, es ist ein Objekt, das Zugriff auf eine Liste von Schlüssel / Wert-Paaren bietet. Es ist also kein gewöhnliches Objekt oder Array.
Zum Beispiel hat es das Längenattribut, das im Gegensatz zum Array-Längenattribut schreibgeschützt ist und die Anzahl der Schlüssel im Speicher zurückgibt.
Mit einem Array können Sie Folgendes tun:
Hier haben wir den ersten Grund, die Getter / Setter zu verwenden. Was ist, wenn Sie ein Element mit dem Namen festlegen möchten
length
?Bei anderen Mitgliedern des Speicherobjekts ist dies sogar noch kritischer, da sie beschreibbar sind und Sie versehentlich Methoden wie überschreiben können
getItem
. Die Verwendung der API-Methoden verhindert eines dieser möglichen Probleme und bietet eine konsistente Schnittstelle.Interessant ist auch der folgende Absatz in der Spezifikation (von mir hervorgehoben):
Theoretisch sollte es keinen Unterschied zwischen den Gettern / Setzern und dem
[]
Zugang geben, aber man weiß nie ...quelle
length
Eigenschaft wird sich nicht ändern (zumindest in Chrome und Firefox [*]) , wenn Sie anrufenlocalStorage.setItem("length", something);
, aber Sie können abrufensomething
mitlocalStorage.getItem("length");
. Interessanterweise ist das ZuweisenlocalStorage.length = something;
in Chrome ein No-Op, aber in Firefox wird essomething
unter dem Schlüssel gespeichert"length"
(den Sie dann nur über die Funktionsoberfläche abrufen können). [*] In Firefoxlength
ändert sich die Eigenschaft, wenn der Schlüssel"length"
noch nicht vorhanden istlocalStorage
.localStorage
hat sechs vordefinierte Eigenschaften:length
,key
,getItem
,setItem
,removeItem
, undclear
.Ich weiß, dass es sich um einen alten Beitrag handelt, aber da niemand die Leistung erwähnt hat, habe ich einige JsPerf-Tests eingerichtet, um sie zu bewerten. Außerdem ist er eine kohärente Benutzeroberfläche
getItem
undsetItem
durchweg schneller als die Verwendung von Punktnotationen oder Klammern und viel einfacher zu lesen.Hier sind meine Tests auf JsPerf
quelle
getItem
undsetItem
waren in jeder Kategorie die langsamsten, wobei Punkt auf Chrom am schnellsten und Klammer auf Firefox am schnellsten ist. Ich denke auch, dass "viel einfacher zu lesen" völlig subjektiv ist ... Ja, es gibt die Funktion an, die es ausführt, aber jeder, der jemals mit Objekt- oder Array-Variablen gearbeitet hat, würde in einer halben Sekunde wissen, was mit Punkt / Klammer passiert.Wie bereits erwähnt, gibt es fast keinen Unterschied außer dem nicht vorhandenen Schlüssel. Der Leistungsunterschied hängt davon ab, welchen Browser / welches Betriebssystem Sie verwenden. Aber so anders ist es nicht.
Ich empfehle Ihnen, die Standardschnittstelle zu verwenden, nur weil dies eine empfohlene Art der Verwendung ist.
quelle