A implementação de armazenamento do Firefox só pode armazenar strings, mas em setembro de 2009 , o W3C modificou o rascunho para aceitar quaisquer dados.A implementação (ainda) ainda não foi atualizada( veja Editar abaixo ).
Portanto, no seu caso, o booleano é convertido em uma string.
Quanto ao motivo "true" != true
, conforme escrito na descrição de Equal ( ==
) no MDC *:
Se os dois operandos não forem do mesmo tipo, o JavaScript converte os operandos e aplica a comparação estrita. Se o operando for um número ou booleano, os operandos serão convertidos em números, se possível; senão, se qualquer operando for uma string, o outro operando será convertido em uma string, se possível.
Observe que a string é convertida em um número em vez de um booleano . Como "true"
convertido em um número é NaN
, ele não será igual a nada, então false
é retornado.
(*: Para o padrão real, consulte ECMA-262 §11.9.3 "O algoritmo de comparação de igualdade abstrata")
Editar: A setItem
interface foi revertida para aceitar strings apenas no rascunho de 1º de setembro de 2011 para corresponder ao comportamento das implementações existentes, pois nenhum dos fornecedores está interessado em oferecer suporte ao armazenamento de não strings. Consulte https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111 para obter detalhes.
Por enquanto, todas as implementações Safari , WebKit, Chrome, Firefox e IE seguem uma versão antiga do padrão WebStorage, onde o valor dos itens de armazenamento pode ser apenas uma string.
Uma opção seria usar JSON
parse
estringify
método para serializar e desserializar os dados, como sugeri há algum tempo em outra pergunta , por exemplo:fonte
value
não for um JSON válido (por exemploJSON.parse("a random string")
)Minhas soluções:
fonte
true == 'true'
éfalse
.localStorage.getItem(pre)==='true'
sem o restoIsso está relacionado à resposta do CMS.
Aqui está uma pequena função que venho usando para lidar com a parte de análise desse problema (a função continuará fazendo a coisa certa depois que as implementações do navegador alcançarem as especificações, portanto, não há necessidade de se lembrar de alterar o código mais tarde):
fonte
Use store.js :
↓
fonte
Não tenho certeza se LocalStorage pode salvar valores booleanos, mas posso dizer que, quando você fizer
alert("true" == true);
isso, nunca será avaliado como verdadeiro porque você está comparando implicitamente uma string com um booleano. É por isso que você deve usar valores booleanos emtrue
vez de"true"
.fonte
"1" === 1
retornaria realmente falso.eval
também pode ser usado com cuidado em alguns casos.fonte
eval
pois pode ser inseguro. PrefiraJSON.parse("true")
.O que geralmente faço é apenas salvar o valor em LocalStore como um booleano e, em seguida, recuperar com um método de análise, apenas para ter certeza para todos os navegadores. Meu método abaixo é personalizado para minha lógica de negócios. Às vezes, posso armazenar smth como "não" e ainda precisar
false
em trocafonte