La implementación de Storage de Firefox solo puede almacenar cadenas, pero en septiembre de 2009 , W3C modificó el borrador para aceptar cualquier dato.La implementación (todavía) no se ha puesto al día todavía( ver Editar a continuación ).
Entonces, en su caso, el booleano se convierte en una cadena.
En cuanto a por qué "true" != true
, como está escrito en la descripción de Equal ( ==
) en MDC *:
Si los dos operandos no son del mismo tipo, JavaScript convierte los operandos y luego aplica una comparación estricta. Si alguno de los operandos es un número o un booleano, los operandos se convierten en números si es posible; de lo contrario, si alguno de los operandos es una cadena, el otro operando se convierte en una cadena si es posible.
Tenga en cuenta que la cadena se convierte en un número en lugar de un booleano . Dado que "true"
convertido a un número es NaN
, no será igual a nada, por lo que false
se devuelve.
(*: Para conocer el estándar actual, consulte ECMA-262 §11.9.3 “El algoritmo de comparación de igualdad abstracta”)
Editar: La setItem
interfaz se revirtió para aceptar cadenas solo en el borrador del 1 de septiembre de 2011 para que coincida con el comportamiento de las implementaciones existentes, ya que ninguno de los proveedores está interesado en admitir el almacenamiento de cadenas que no sean cadenas. Consulte https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111 para obtener más detalles.
Por el momento, todas las implementaciones de Safari , WebKit, Chrome, Firefox e IE , siguen una versión antigua del estándar WebStorage, donde el valor de los elementos de almacenamiento puede ser solo una cadena.
Una opción sería usar JSON
parse
y elstringify
método para serializar y deserializar los datos, como sugerí hace algún tiempo en otra pregunta , por ejemplo:fuente
value
no es JSON válido (por ejemploJSON.parse("a random string")
)Mis soluciones:
fuente
true == 'true'
esfalse
.localStorage.getItem(pre)==='true'
sin el restoEsto está relacionado con la respuesta de CMS.
Aquí hay una pequeña función que he estado usando para manejar la parte de análisis de este problema (la función seguirá haciendo lo correcto después de que las implementaciones del navegador se pongan al día con la especificación, por lo que no es necesario recordar cambiar el código más adelante):
fuente
Utilice store.js :
↓
fuente
No estoy seguro de si LocalStorage puede guardar valores booleanos, pero puedo decirle que cuando lo haga
alert("true" == true);
nunca se evaluará como verdadero porque está comparando implícitamente una cadena con un booleano. Es por eso que para establecer los valores booleanos que usa entrue
lugar de"true"
.fuente
"1" === 1
en realidad devolvería falso.eval
también se puede utilizar con cuidado en algunos casos.fuente
eval
ya que puede ser peligroso. PreferirJSON.parse("true")
.Lo que suelo hacer es guardar el valor en LocalStore como booleano y luego recuperarlo con un método de análisis, solo para estar seguro para todos los navegadores. Mi método a continuación está personalizado para mi lógica empresarial. A veces puedo almacenar algo como 'no' y todavía necesito
false
a cambiofuente