不能在 LocalStorage 中设置布尔值?

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

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

当我尝试测试 localStorage.getItem("item1") == "true"时,它总是警告 true | false,它警告为真... 我怎样才能将 localStorage中的一个项目设置为真?

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

那么

alert("true" == true); // should be true?
144688 次浏览

我不确定 LocalStorage 是否能够保存布尔值,但是我可以告诉你,当你执行 alert("true" == true);时,它永远不会计算为 true,因为你隐式地将一个字符串与一个布尔值进行比较。这就是为什么要使用 true而不是 "true"来设置布尔值。

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

一个选择是使用 JSON parsestringify方法来处理 连载反序列化数据,正如我前段时间在 另一个问题中建议的那样,例如:

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

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

因此在您的例子中,布尔值被转换为字符串。

至于为什么 "true" != true,正如 MDC 中的等价(==)描述 * 中所写的那样:

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

注意,字符串被转换为 号码而不是 布尔型。由于 "true"转换成数字是 NaN,它不等于任何值,所以返回 false

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


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

这与 CMS 的答案有关。

下面是我用来处理这个问题的解析部分的一个小函数(在浏览器实现达到规范要求之后,这个函数会继续做正确的事情,所以以后不需要记得更改代码) :

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

我的解决方案:

function tytPreGetBool(pre) {
return localStorage.getItem(pre) === 'true';
}

eval在某些情况下也可以使用 小心点

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

使用 Store Js:

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

名片

store.get('isUser')  //true

我通常只是将 LocalStore 中的值保存为 Boolean 值,然后使用解析方法检索,以确保适用于所有浏览器。下面的方法是为我的业务逻辑定制的。有时候我可能存储为’没有’,仍然需要 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;}
}

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

let storeMe = {
myBool: true
}


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


当我需要存储 旗帜时,我通常会这样做:
localStorage.f_active = true(存储值为‘ true’且正常)
传球

并解除旗帜:
delete localStorage.f_active
不传递(返回值未定义)