无法在LocalStorage中设置布尔值?

时间:2010-07-16 08:33:06

标签: javascript

我注意到我无法在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? 

9 个答案:

答案 0 :(得分:68)

目前,所有实施Safari,WebKit,Chorme,FirefoxIE都遵循WebStorage标准的old version,其中的值为存储项目只能是一个字符串。

一个选项是使用JSON parsestringify方法序列化反序列化数据,正如我前段时间建议的那样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;}
}