无法在 LocalStorage 中设置布尔值?

IT技术 javascript
2021-01-13 23:42:48

我注意到我不能在localStorage?

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

true | false当我尝试测试localStorage.getItem("item1") == "true"总是发出警报警报为真...如何将项目设置localStorage为真?

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

所以

alert("true" == true); // should be true? 
6个回答

目前,Safari、WebKit、Chrome、FirefoxIE 的所有实现都遵循旧版本的 WebStorage 标准,其中存储项的值只能是一个字符串。

一种选择是使用 JSONparsestringify方法来序列化序列化数据,正如我前段时间在另一个问题中建议的那样,例如:

var value = "true";
console.log(JSON.parse(value) === true); // true

真的@AdonisK。但是,如果他在设置所有值时使用 JSON.stringify,那么他就可以将输出有效 JSON 的责任转移到库中。这是一个非常稳定的库。
2021-03-20 23:42:48
目前的规范定义了一个接口,其中getItem仅返回一个字符串或nullsetItem仅接受字符串。阅读其他答案,似乎这不会改变,因此此答案中的措辞已过时。
2021-03-21 23:42:48
如果传入的字符串value不是有效的 JSON(例如JSON.parse("a random string")),这显然会中断
2021-04-04 23:42:48
是的 - 这不是版本,它是唯一的版本。
2021-04-04 23:42:48

Firefox 对 Storage 的实现只能存储字符串,但在2009 年 9 月,W3C 修改了草案以接受任何数据。实施(仍然)尚未赶上请参阅下面的编辑)。

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

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

如果两个操作数的类型不同,JavaScript 会转换操作数,然后应用严格的比较。如果操作数是数字或布尔值,则尽可能将操作数转换为数字else 如果任一操作数是字符串,则另一个操作数在可能的情况下转换为字符串。

请注意,字符串被转换为Number而不是Boolean由于"true"转换为数字 is NaN,它不会等于任何东西,因此false返回。

(*:有关实际标准,请参阅 ECMA-262 §11.9.3 “抽象平等比较算法”)


编辑:setItem接口仅在2011 年 9 月 1 日草案中恢复为接受字符串以匹配现有实现的行为,因为没有一个供应商对支持存储非字符串感兴趣。有关详细信息,请参阅https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111

@Andy,请查看有关该主题的有用说明
2021-03-20 23:42:48
如果操作数是数字或布尔值,则操作数会尽可能转换为数字- 我完全没有意识到这一点。我想如果一个是字符串,另一个被转换为字符串。干杯(+1)。
2021-03-31 23:42:48

我的解决方案:

function tytPreGetBool(pre) {
    return localStorage.getItem(pre) === 'true';
}
@koppor 也许是因为如果 getItem 会返回一个布尔值,那么此方法将产生错误的结果,因为true == 'true'is false
2021-03-20 23:42:48
"? true : false" 是不必要的,因为 localStorage.getItem(pre) == 'true' 已经给你一个布尔结果
2021-03-22 23:42:48
..或者localStorage.getItem(pre)==='true'没有其他的简单
2021-04-07 23:42:48
@koppor 为什么这被否决了?因为自以为是的堆垛机溢出了​​,字面意思是:)
2021-04-07 23:42:48

这与CMS的回答有关。

这是我一直在使用的一个小函数来处理这个问题的解析部分(在浏览器实现赶上规范后,该函数将继续做正确的事情,因此以后无需记住更改代码):

function parse(type) {
   return typeof type == 'string' ? JSON.parse(type) : type;
}
与 JSON.parse 相比,这不是不必要的吗?JSON.parse("true") 和 JSON.parse(true) 都已经返回 true,所以在浏览器实现 boolean localstorage 后仍然会做正确的事情
2021-04-03 23:42:48

使用store.js

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

store.get('isUser')  //true
但是真的有必要为这个简单的字符串到布尔值转换任务包含一个完整的库吗?
2021-03-12 23:42:48