无法在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 parsestringify方法来序列化 序列化数据,正如我前一段时间在另一个问题中提出的 ,例如:

 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;} }