2010-07-16 209 views
65

我注意到我不能在localStorage中设置布尔值?无法在LocalStorage中设置布尔值?

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

总是提醒true | false当我尝试测试localStorage.getItem("item1") == "true"它提醒真...所以没有办法,我可以在localStorage设置项为真?

即使它的一个字符串,我想只有===会检查类型?

所以

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

回答

35

Firefox's implementation of Storage只能存储字符串,但在2009 September上,W3C修改了草案以接受任何数据。 执行(仍)尚未赶上请参阅编辑以下)。

所以在你的情况下,布尔值被转换为一个字符串。

至于为什么"true" != true,写在the description of Equal (==) in MDC *:

如果两个操作数是相同类型的不是,JavaScript的转换操作数则实行严格的比较。如果任一操作数是数字或布尔值,则尽可能将操作数转换为号码;否则,如果其中一个操作数是一个字符串,则另一个操作数将尽可能转换为字符串。

注意该字符串转换为而不是布尔。由于"true"转换为一个数字是NaN,它不会等于任何东西,所以返回false

(*:实际标准见ECMA-262 § 11.9。3“摘要相等比较算法”)


编辑:setItem接口被恢复为仅接受在2011 Sept 1st draft串以匹配现有的实现的行为,因为没有供应商的有兴趣支持存储非字符串。详情请参阅https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111

+1

*如果任一操作数是数字或布尔值,则操作数将转换为**数字**如果可能的话*我完全没有意识到这一点。我想如果一个是一个字符串,另一个是投到一个字符串。干杯(+1)。 – 2010-07-16 09:01:20

+2

@安迪,请检查这个[有用的注释](http://dmitrysoshnikov.com/notes/note-2-ecmascript-equality-operators/)。 – CMS 2010-07-16 16:00:40

+0

@CMS:谢谢,很棒的阅读。 – 2010-07-16 16:15:52

1

我不知道如果localStorage的可以节省布尔值,但我可以告诉你,当你做alert("true" == true);它永远不会计算为true,因为你是比较含蓄的字符串为布尔值。这就是为什么要设置布尔值,您使用true而不是"true"

+1

什么警报(“1” == 1)? Javascript是一个奇怪的(而且不一致的)讨厌的人。 – spender 2010-07-16 08:45:22

+2

@安迪:不,它不是。 – kennytm 2010-07-16 08:47:28

+0

@spender:这是因为右操作数被转换为字符串进行比较。 '“1”=== 1'实际上会返回false。 – 2010-07-16 08:49:42

54

目前,所有的实施方式中Safari,WebKit的,Chorme,FirefoxIE跟随的WebStorage标准,其中,存储项目的值只能是串的old version

一种选择是使用JSON parsestringify方法连载反序列化的数据,我认为前一段时间在another question,例如:

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

如果在'value'中传递的字符串不是有效的JSON(例如'JSON.parse(“随机字符串”)'),那么这显然会中断。) – 2014-12-06 10:40:51

+3

True @AdonisK。但是,如果他在设置所有值时使用JSON.stringify,则他可以将输出有效JSON的责任卸载到库中。这是一个非常稳定的图书馆。 – 2015-02-10 21:18:49

4

[想将这个意见加到CMS的答案上,但我想我还没有被允许。 :-P]

这里有一个小函数我一直用来处理这个问题的解析部分(在浏览器实现赶上规范之后,函数将继续做正确的事情,所以不需要记住后来更改了代码):

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

与JSON.parse相比,这不是没有必要吗? JSON.parse(“true”)和JSON.parse(true)已经都返回true,所以在浏览器实现后仍然会做正确的事情boolean localstorage – bscan 2017-04-22 22:50:42

3

我的解决方案:

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

为什么这是低调的? – koppor 2017-07-06 14:00:28

+0

@koppor也许是因为如果getItem会返回一个布尔值,那么这个方法会产生错误的结果,因为'true =='true''是'false'。 – jox 2017-12-05 15:11:35

1

eval也可以在某些情况下,仔细使用

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

使用store.js

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

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

我最常做的就是保存为布尔在LocalStore的值,然后用解析方法来检索,只是确保所有浏览器。我的方法是根据我的业务逻辑进行定制的。有时候,我会水木清华存储为“不”,但还是需要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;} 
}