无法在LocalStorage中设置布尔值?

Jie*_*eng 99 javascript

我注意到我无法设置布尔值localStorage

localStorage.setItem("item1", true);
alert(localStorage.getItem("item1") + " | " + (localStorage.getItem("item1") == true));
Run Code Online (Sandbox Code Playgroud)

总是true | false在我尝试测试警报时localStorage.getItem("item1") == "true"发出警报...所以我无法将项目设置localStorage为true?

即使它是一个字符串,我认为只会===检查类型?

所以

alert("true" == true); // should be true? 
Run Code Online (Sandbox Code Playgroud)

CMS*_*CMS 80

目前,所有的实现Safari浏览器,WebKit的,Chorme,火狐IE跟随一个旧版本的WebStorage标准,在存储物品的价值只能是一个字符串.

一种选择是使用JSON parsestringify方法序列化反序列化的数据,我建议前段时间在另外一个问题,例如:

var value = "true";
JSON.parse(value) === true; // true
Run Code Online (Sandbox Code Playgroud)

  • 如果在`value`中传递的字符串不是有效的JSON(例如`JSON.parse("随机字符串")`),这显然会中断 (4认同)
  • 真的@AdonisK.但是如果他在设置所有值时使用JSON.stringify,那么他就可以卸载将有效JSON输出到库的责任.这是一个非常稳定的图书馆. (3认同)
  • 是的 - 这不是_旧_版本,它是_唯一_版本。 (2认同)

ken*_*ytm 59

Firefox的Storage实现只能存储字符串,但在2009年9月,W3C修改了草案以接受任何数据.实施(仍然)还没有赶上(见下面的编辑).

因此,在您的情况下,布尔值将转换为字符串.

至于为什么"true" != true,如MDC*中Equal(==)的描述中所写:

如果两个操作数的类型不同,则JavaScript转换操作数,然后应用严格比较.如果操作数是数字或布尔值,操作数将尽可能转换为数字 ; 否则,如果任一操作数是字符串,则另一个操作数将转换为字符串(如果可能).

请注意,该字符串将转换为数字而不是布尔值.由于"true"转换为数字NaN,它将不等于任何东西,因此false返回.

(*:对于实际标准,参见ECMA-262§11.9.3"抽象等式比较算法")


编辑:setItem接口被恢复只接受在琴弦2011九月一日草案,以配合现有实现的行为,没有任何厂商有兴趣支持存储非字符串.有关详细信息,请参阅https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111.

  • *如果操作数是数字或布尔值,则可能的话,操作数将转换为**数字**-我完全没有意识到这一点。我以为如果一个是字符串,另一个被转换为字符串。干杯(+1)。 (2认同)
  • @Andy,检查这个[有用的注释](http://dmitrysoshnikov.com/notes/note-2-ecmascript-equality-operators/). (2认同)

小智 9

我的解决方案

function tytPreGetBool(pre) {
    return localStorage.getItem(pre) === 'true';
}
Run Code Online (Sandbox Code Playgroud)

  • ..或简单`localStorage.getItem(pre)==='true'`没有其余的 (8认同)
  • @koppor也许是因为如果getItem会返回一个布尔值,那么这个方法会产生错误的结果,因为`true =='true'`是'false`. (2认同)
  • "? true : false" 是不必要的,因为 localStorage.getItem(pre) == 'true' 已经给你一个布尔结果 (2认同)

Tom*_*mas 8

我想指出的是,将普通布尔值包装在对象内,然后使用JSON.stringify创建本地存储内容和其他方式JSON.parse来检索它可能会更容易:

let storeMe = {
  myBool: true
}

localStorage.setItem('test', JSON.stringify(storeMe))
let result = JSON.parse(localStorage.getItem('test'))

Run Code Online (Sandbox Code Playgroud)


old*_*boy 6

这与CMS的答案有关。

这是我一直使用的一个小功能来处理此问题的解析部分(该功能将在浏览器实现赶上规范后继续执行Right Thing,因此无需记住以后要更改代码):

function parse(type) {
   return typeof type == 'string' ? JSON.parse(type) : type;
}
Run Code Online (Sandbox Code Playgroud)

  • 与 JSON.parse 相比,这不是不必要的吗?JSON.parse("true") 和 JSON.parse(true) 都已经返回 true,所以在浏览器实现 boolean localstorage 后仍然会做正确的事情 (2认同)