Javascript 无法在LocalStorage中设置布尔值?

Javascript 无法在LocalStorage中设置布尔值?,javascript,Javascript,我注意到我不能在localStorage中设置布尔值 localStorage.setItem("item1", true); alert(localStorage.getItem("item1") + " | " + (localStorage.getItem("item1") == true)); 当我尝试测试localStorage.getItem(“item1”)=“true”时,总是发出警报true | false,它会发出警报true。。。如何将localStorage中的项目设置

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

localStorage.setItem("item1", true);
alert(localStorage.getItem("item1") + " | " + (localStorage.getItem("item1") == true));
当我尝试测试
localStorage.getItem(“item1”)=“true”
时,总是发出警报
true | false
,它会发出警报true。。。如何将
localStorage
中的项目设置为true

即使是字符串,我想只有
==
会检查类型

所以


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

目前,所有的实现,WebKit、Chrome和,都遵循WebStorage标准,其中存储项的值只能是字符串

一个选项是使用JSON
parse
stringify
方法对数据进行序列化和反序列化,正如我不久前在中所建议的,例如:

var value = "true";
JSON.parse(value) === true; // true
只能存储字符串,但在上,W3C修改了草稿以接受任何数据。实现(仍然)尚未完成(请参见下面的编辑)

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

至于为什么
“正确”!=true
,如*:

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

请注意,字符串被转换为数字而不是布尔值。由于
转换为数字的“true”
NaN
,因此它将不等于任何值,因此返回
false

(*:实际标准见ECMA-262§11.9.3“抽象等式比较算法”)



编辑:
setItem
接口恢复为仅在上接受字符串,以匹配现有实现的行为,因为没有供应商对支持存储非字符串感兴趣。有关详细信息,请参阅

这与CMS的答案有关

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

我的解决方案:

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

eval
在某些情况下也可以谨慎使用

console.log(eval("true") === true) //true
使用:


我通常只需将值保存在LocalStore中作为布尔值,然后使用解析方法进行检索,以确保所有浏览器都能使用。我下面的方法是为我的业务逻辑定制的。有时我可能会将smth存储为“否”,但仍然需要
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'))


警报(“1”==1)怎么样?Javascript是一个奇怪(且不一致)的beasty。@spender:这是因为正确的操作数被转换为字符串进行比较<代码>“1”==1
实际上会返回false。@Kenny:哇,facepalm,谢谢你的更正:-)我被搞混了,因为布尔值是如何转换成字符串的。如果操作数是数字或布尔值,如果可能的话,操作数会转换成数字-我完全没有意识到这一点。我想,如果一个是一根绳子,另一个就被抛成了一根绳子。干杯(+1)。@Andy,检查这个主题。如果传入的
value
字符串不是有效的JSON(例如
JSON.parse(“一个随机字符串”)
)True@AdonisK,这显然会中断。但是,如果他在设置所有值时使用JSON.stringify,那么他就可以卸下向库输出有效JSON的责任。这是一个非常稳定的库。与JSON.parse相比,这不是没有必要吗?JSON.parse(“true”)和JSON.parse(true)都已返回true,因此在浏览器实现布尔值后仍将执行正确的操作localstorage@koppor可能是因为如果getItem将返回布尔值,那么此方法将产生错误结果,因为
true==“true”
false
…或plain
localStorage.getItem(pre)=='true'
不带rest@koppor为什么会被否决?因为自以为是的堆栈溢出,字面意思是:)“?true:false”是不必要的,因为localStorage.getItem(pre)='true'已经给你一个布尔结果,但是仅仅为了这个简单的字符串到布尔转换任务,真的有必要包含整个库吗?避免
eval
,因为它可能不安全。首选
JSON.parse(“true”)
localStorage.setItem('isUser', true)
localStorage.getItem('isUser') === "true" //true
npm i -D store
store.get('isUser')  //true
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;}
}
let storeMe = {
  myBool: true
}

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