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标准,其中存储项的值只能是字符串
一个选项是使用JSONparse
和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
…或plainlocalStorage.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'))