我注意到我无法在localStorage
中设置布尔值?
localStorage.setItem("item1", true);
alert(localStorage.getItem("item1") + " | " + (localStorage.getItem("item1") == true));
当我尝试对true | false
进行测试时,始终提醒localStorage.getItem("item1") == "true"
警告为真...所以我无法将localStorage
中的项目设置为真?
即使它是一个字符串,我认为只有===
会检查类型?
所以
alert("true" == true); // shld be true?
答案 0 :(得分:68)
目前,所有实施Safari,WebKit,Chorme,Firefox和IE都遵循WebStorage标准的old version,其中的值为存储项目只能是一个字符串。
一个选项是使用JSON parse
和stringify
方法序列化和反序列化数据,正如我前段时间建议的那样another question,例如:
var value = "true";
JSON.parse(value) === true; // true
答案 1 :(得分:51)
Firefox's implementation of Storage只能存储字符串,但在2009 September上,W3C修改了草稿以接受任何数据。 实现(仍然)尚未赶上(请参阅下面的编辑)。
因此,在您的情况下,布尔值将转换为字符串。
关于"true" != true
的原因the description of Equal (==
) in MDC *:
如果两个操作数的类型不同,JavaScript会转换操作数,然后应用严格比较。如果操作数是数字或布尔值,则操作数将转换为数字(如果可能);否则,如果任一操作数是一个字符串,则另一个操作数将转换为字符串(如果可能)。
请注意,该字符串将转换为 Number 而不是 Boolean 。由于转换为"true"
的数字为NaN
,因此它不会等同于任何内容,因此会返回false
。
(*:对于实际标准,参见ECMA-262§11.9.3“抽象等式比较算法”)
编辑: setItem
接口已恢复为仅接受2011 Sept 1st draft上的字符串以匹配现有实施的行为,因为没有供应商对支持存储感兴趣非字符串。有关详细信息,请参阅https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111。
答案 2 :(得分:6)
我的解决方案:
var newArray = [{ "item": { "id": 1, "name": "item1" }, "type": [1, 2, 3] }, { "item": { "id": 2, "name": "item2" }, "type": [4, 5] }, { "item": { "id": 3, "name": "item3" }, "type": [8, 9] }, { "item": { "id": 1, "name": "item1" }, "type": [11, 12] }, { "item": { "id": 2, "name": "item3" }, "type": [31, 41] }, { "item": { "id": 3, "name": "item3" }, "type": [11, 23] }],
resultArray = [];
newArray.forEach(function (a) {
if (!this[a.item.id]) {
this[a.item.id] = { item: a.item, type: [] };
resultArray.push(this[a.item.id]);
}
this[a.item.id].type = this[a.item.id].type.concat(a.type);
}, Object.create(null));
document.write('<pre>' + JSON.stringify(resultArray, 0, 4) + '</pre>');
答案 3 :(得分:4)
[想把这个评论写在CMS的答案上,但我想我还不准。 :-P]
这是我用来处理这个问题的解析部分的一个小函数(该函数将在浏览器实现赶上规范后继续做正确的事情,所以不需要记得以后更改代码) :
function parse(type) {
return typeof type == 'string' ? JSON.parse(type) : type;
}
答案 4 :(得分:3)
使用store.js:
localStorage.setItem('isUser', true)
localStorage.getItem('isUser') === "true" //true
npm i -D store
↓
store.get('isUser') //true
答案 5 :(得分:2)
我想指出,将普通布尔值包装在对象中可能会更容易一些,然后使用 JSON.stringify
创建本地存储内容和其他方式,JSON.parse
来检索它:
let storeMe = {
myBool: true
}
localStorage.setItem('test', JSON.stringify(storeMe))
let result = JSON.parse(localStorage.getItem('test'))
答案 6 :(得分:1)
我不确定LocalStorage是否可以保存布尔值,但我可以告诉你,当你执行alert("true" == true);
时,它永远不会评估为true,因为你隐式地将字符串与布尔值进行比较。这就是为什么要设置使用true
而不是"true"
的布尔值。
答案 7 :(得分:1)
State 4:
(3) rStmtList ::= LCURLY *
rObj ::= LCURLY * rObjItemList RCURLY
rObjItemList ::= * rObjItemList COMMA rObjItem
rObjItemList ::= * rObjItem
rObjItem ::= * ID COLON rExpr
ID shift 8
ID reduce 3 ** Parsing conflict **
rObjItemList shift 6
rObjItem shift-reduce 8 rObjItemList ::= rObjItem
{default} reduce 3 rStmtList ::= LCURLY
也可以小心。
eval
答案 8 :(得分:1)
我通常只是将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;}
}