2010-07-16 12 views
65

noté que no puedo establecer valores booleanos en localStorage?¿No se pueden establecer valores booleanos en LocalStorage?

localStorage.setItem("item1", true); 
alert(localStorage.getItem("item1") + " | " + (localStorage.getItem("item1") == true)); 

siempre alertas true | false cuando intento probar localStorage.getItem("item1") == "true" avisa verdad ... así que no hay manera que puedo establecer un elemento en localStorage a cierto?

incluso si es una cadena, pensé que solo === verificaría el tipo?

por lo

alert("true" == true); // shld be true? 

Respuesta

35

Firefox's implementation of Storage sólo pueden cadenas de tiendas , pero en 2009 September, W3C modificó el borrador para aceptar cualquier dato. La implementación (todavía) no se ha alcanzado aún (ver Editar debajo de).

Por lo tanto, en su caso, el booleano se convierte en una cadena.

cuanto a por qué "true" != true, como está escrito en the description of Equal (==) in MDC *:

Si los dos operandos no son del mismo tipo, JavaScript convierte los operandos luego aplica comparación estricta. Si cualquiera de los operandos es un número o un booleano, los operandos se convierten a números si es posible; de lo contrario, si un operando es una cadena, el otro operando se convierte en una cadena si es posible.

Tenga en cuenta que la cadena se convierte a un número en lugar de un de Boole. Como "true" convertido a un número es NaN, no será igual a nada, por lo que se devuelve false.

(*: Para el estándar actual, vea ECMA-262 § 11.9.3 “La comparación algoritmo abstracto Igualdad”)


Editar: La interfaz setItem se revirtió a aceptar cadenas sólo en el 2011 Sept 1st draft para que coincida con el comportamiento de las implementaciones existentes, ya que ninguno de los vendedores están interesados ​​en apoyar el almacenamiento sin cuerdas. Ver https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111 para más detalles.

+1

* Si cualquier operando es un número o un booleano, los operandos se convierten a ** números ** si es posible * - No me di cuenta de eso. Pensé que si uno fuera una cuerda, la otra sería una cuerda. Saludos (+1). –

+2

@Andy, mira esto [notas útiles] (http://dmitrysoshnikov.com/notes/note-2-ecmascript-equality-operators/) sobre el tema. – CMS

+0

@CMS: gracias, una gran lectura. –

1

no estoy seguro de si LocalStorage puede guardar los valores booleanos pero se puede decir que cuando lo hace alert("true" == true); nunca se evaluará como true, ya que está comparando implícitamente una cadena a un valor lógico. Es por eso que para establecer los valores booleanos usa true en lugar de "true".

+1

¿Qué hay de alerta ("1" == 1)? Javascript es un beasty extraño (e inconsistente). – spender

+2

@Andy: No, no lo es. – kennytm

+0

@spender: eso se debe a que el operando correcto se convierte en una cadena para la comparación. '" 1 "=== 1' en realidad devolvería falso. –

54

Por el momento, todas las implementaciones Safari, WebKit, Chorme, Firefox y IE, siguiendo un old version de la norma WebStorage, donde el valor de los elementos de almacenamiento puede ser sólo una cadena.

Una opción sería utilizar JSON parse y stringify método para serializar y deserializar los datos, como sugerí hace algún tiempo en another question, por ejemplo:

var value = "true"; 
JSON.parse(value) === true; // true 
+1

Esto obviamente se romperá si la cadena pasada en 'value' no es válida JSON (por ejemplo' JSON.parse ("una cadena aleatoria") ') –

+3

True @AdonisK. Pero si está utilizando JSON.stringify cuando establece todos los valores, entonces puede descargar la responsabilidad de enviar JSON válidos a la biblioteca. Y esa es una biblioteca muy estable. –

4

[Quería adjuntar este comentario a la respuesta de CMS, pero supongo que aún no puedo hacerlo. :-P]

He aquí 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 una vez que las implementaciones del navegador alcancen la especificación, por lo que no es necesario recordar cambiar a cabo código más tarde):

function parse(type) { 
    return typeof type == 'string' ? JSON.parse(type) : type; 
} 
+1

¿No es esto innecesario en comparación con JSON.parse? JSON.parse ("true") y JSON.parse (true) ya devuelven true, por lo que seguirán haciendo lo correcto después de que los navegadores implementen boolean localstorage – bscan

3

Mis soluciones:

function tytPreGetBool(pre) { 
    return localStorage.getItem(pre) == 'true' ? true : false; 
} 
+0

¿Por qué se aplica este downvoted? – koppor

+0

@koppor Tal vez porque si getItem alguna vez devolvería un valor booleano, entonces este método arrojará resultados falsos, ya que 'verdadero == 'verdadero'' es' falso'. – jox

1

eval también se puede utilizar con cuidado bajo algunos casos.

console.log(eval("true") === true) //true 
1

Uso store.js:

localStorage.setItem('isUser', true) 
localStorage.getItem('isUser') === "true" //true 
npm i -D store 

store.get('isUser') //true 
0

Lo que suelo hacer es guardar el valor en localstore como un booleano, y luego recuperar con un método de análisis sintáctico, sólo para estar seguro para todos los navegadores. Mi método a continuación está personalizado para mi lógica comercial. A veces puede almacenar Smth como 'no' y todavía necesita false a cambio

function toBoolean(str) { 
    if (typeof str === 'undefined' || str === null) { 
     return false; 
    } else if (typeof str === 'string') {   
     switch (str.toLowerCase()) { 
     case 'false': 
     case 'no': 
     case '0': 
     case "": 
      return false; 
     default: 
      return true; 
     } 
    } else if (typeof str === 'number') { 
     return str !== 0 
    } 
    else {return true;} 
} 
Cuestiones relacionadas