无法在LocalStorage中设置布尔值?
我注意到,我不能在localStorage
设置布尔值?
localStorage.setItem("item1", true); alert(localStorage.getItem("item1") + " | " + (localStorage.getItem("item1") == true));
总是提示true | false
true | false
当我尝试testinglocalStorage.getItem("item1") == "true"
它提醒真正的…所以没办法,我可以在localStorage
设置项目为真?
即使它的string,我想只有===
会检查types?
所以
alert("true" == true); // shld be true?
Firefox的存储实现只能存储string,但在2009年9月 ,W3C修改了草稿接受任何数据。 实施(仍)尚未赶上 ( 请参阅下面的编辑 )。
所以在你的情况下,布尔值被转换为一个string。
至于为什么"true" != true
,写在MDC *中的Equal( ==
)的描述中 :
如果两个操作数的types不同,JavaScript会转换操作数,然后进行严格的比较。 如果任一操作数是一个数字或一个布尔值,操作数将尽可能转换为数字 。 否则,如果任一操作数是一个string,则另一个操作数将被转换为一个string(如果可能)。
请注意,该string被转换为数字而不是布尔值 。 由于"true"
转换为一个数字是NaN
,它不会等于任何东西,所以返回false
。
(*:实际标准见ECMA-262§11.9.3“抽象相等比较algorithm”)
编辑:只有在2011年9月1日的草案中 , setItem
接口才恢复为接受string,以匹配现有实现的行为,因为没有任何供应商有兴趣支持存储非string。 有关详细信息,请参阅https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111 。
目前, Safari ,WebKit,Chorme, Firefox和IE的所有实现都遵循旧版本的WebStorage标准,其中存储项目的值只能是一个string。
一个选项是使用JSON parse
和stringify
方法来序列化和反 序列化数据,正如我前一段时间在另一个问题中提出的 ,例如:
var value = "true"; JSON.parse(value) === true; // true
[想把这个意见加到CMS的答案上,但是我想我还没有被允许。 :-P]
下面是我用来处理这个问题的parsing部分的一个小函数(在浏览器实现赶上规范之后,函数将继续做正确的事情,所以以后不需要记住更换代码):
function parse(type) { return typeof type == 'string' ? JSON.parse(type) : type; }
eval
在某些情况下也可以使用。
console.log(eval("true") === true) //true
我不确定LocalStorage是否可以保存布尔值,但是我可以告诉你,当你做alert("true" == true);
它永远不会计算为真,因为你隐式地比较了一个string和一个布尔值。 这就是为什么设置布尔值你使用true
而不是"true"
。
我的解决scheme
function tytPreGetBool(pre) { return localStorage.getItem(pre) == 'true' ? true : false; }
使用store.js :
localStorage.setItem('isUser', true) localStorage.getItem('isUser') === "true" //true npm i -D store
↓
store.get('isUser') //true
我通常所做的只是将其作为布尔值保存在LocalStore中,然后使用parsing方法进行检索,以确保所有浏览器都可用。 我的方法是为我的业务逻辑定制的。 有时候,我可能会把“不”作为“否”存储起来,而且还需要false
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;} }