In der Firefox-Implementierung von Storage können nur Zeichenfolgen gespeichert werden. Im September 2009 hat W3C den Entwurf so geändert, dass alle Daten akzeptiert werden.Die Implementierung (noch) ist noch nicht aufgeholt( siehe Bearbeiten unten ).
In Ihrem Fall wird der Boolesche Wert also in einen String konvertiert.
Wie "true" != true
, wie in der Beschreibung von Equal ( ==
) in MDC * geschrieben:
Wenn die beiden Operanden nicht vom gleichen Typ sind, konvertiert JavaScript die Operanden und wendet dann einen strengen Vergleich an. Wenn einer der Operanden eine Zahl oder ein Boolescher Wert ist, werden die Operanden nach Möglichkeit in Zahlen konvertiert . Wenn einer der Operanden eine Zeichenfolge ist, wird der andere Operand nach Möglichkeit in eine Zeichenfolge konvertiert.
Beachten Sie, dass die Zeichenfolge anstelle eines Booleschen Werts in eine Zahl konvertiert wird . Da in eine Zahl konvertiert ist , wird es nicht gleich irgendetwas sein, also wird zurückgegeben."true"
NaN
false
(*: Für den aktuellen Standard siehe ECMA-262 §11.9.3 „Der abstrakte Gleichheitsvergleichsalgorithmus“)
Bearbeiten: Die setItem
Benutzeroberfläche wurde zurückgesetzt, um Zeichenfolgen nur im Entwurf vom 1. September 2011 zu akzeptieren , um dem Verhalten vorhandener Implementierungen zu entsprechen, da keiner der Anbieter daran interessiert ist, das Speichern von Nicht-Zeichenfolgen zu unterstützen. Weitere Informationen finden Sie unter https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111 .
Derzeit folgen alle Implementierungen von Safari , WebKit, Chrome, Firefox und IE einer alten Version des WebStorage-Standards, bei der der Wert der Speicherelemente nur eine Zeichenfolge sein kann.
Eine Option wäre die Verwendung von JSON
parse
und einerstringify
Methode zum Serialisieren und Deserialisieren der Daten, wie ich vor einiger Zeit in einer anderen Frage vorgeschlagen habe , zum Beispiel:quelle
value
nicht gültig ist JSON (zum BeispielJSON.parse("a random string")
)Meine Lösungen:
quelle
true == 'true'
heißtfalse
.localStorage.getItem(pre)==='true'
ohne den RestDies hängt mit der Antwort von CMS zusammen.
Hier ist eine kleine Funktion, die ich verwendet habe, um den Parsing-Teil dieses Problems zu behandeln (die Funktion wird weiterhin das Richtige tun, nachdem die Browser-Implementierungen die Spezifikation eingeholt haben, sodass Sie nicht daran denken müssen, den Code später zu ändern):
quelle
Verwenden Sie store.js :
↓
quelle
Ich bin nicht sicher, ob LocalStorage boolesche Werte speichern kann, aber ich kann Ihnen sagen, dass dies
alert("true" == true);
niemals als wahr ausgewertet wird, da Sie implizit eine Zeichenfolge mit einem booleschen Wert vergleichen. Aus diesem Grund sollten Sietrue
stattdessen boolesche Werte festlegen"true"
.quelle
"1" === 1
würde tatsächlich falsch zurückgeben.eval
kann in einigen Fällen auch vorsichtig verwendet werden.quelle
eval
da es unsicher sein kann. LieberJSON.parse("true")
.Normalerweise speichere ich den Wert in LocalStore nur als Booleschen Wert und rufe ihn dann mit einer Analysemethode ab, um sicherzugehen, dass alle Browser dies tun. Meine Methode unten ist für meine Geschäftslogik angepasst. Manchmal speichere ich etw als "Nein" und brauche es immer noch
false
als Gegenleistungquelle