JS:“假”可以被强制类型强制转换为假吗?

时间:2011-07-06 04:12:47

标签: javascript type-coercion

使用Html5时,localStorage值存储为字符串。如果要存储复选框的状态,然后在以后恢复它,则需要处理此事。我希望像这样的东西能起作用:

(function() {
  function e(id) { return document.getElementById(id); }

  e('save').addEventListener('click', function() {
   localStorage['check-value'] = e('checkbox').checked
  })
  e('checkbox').checked = localStorage['check-value'];
})();

但是,如果未选中此框并且字符"false"被类型强制转换为"false",那么'check-value'似乎会存储true行的内容。倒数第二行。我知道我可以进行一些if-test,但这是一个爱好项目,如果可能的话我想弄明白。可以"false"强制false吗?

我没有使用这个btw的库,因为它是一个chrome扩展,我想保持它的轻量级。

6 个答案:

答案 0 :(得分:3)

“false”只是一个字符串,你需要在这里做自己的检查。

答案 1 :(得分:3)

您可以测试它是否等于字符串“false”:

e('checkbox').checked = localStorage['check-value'] != 'false';

或者,您可以在存储它之前以及在检索它之后将其强制转换为数字:

localStorage['check-value'] = +e('checkbox').checked
// ...
e('checkbox').checked = +localStorage['check-value']

答案 2 :(得分:2)

您可以尝试使用JSON.parse来提取值。理想情况下,您还可以使用JSON.stringify来序列化对象等。您可以通过将其抽象出其他接口来使其更易于管理。

JSON.parse("false") == false

包装器的示例:

var LocalStorageManager = new (function () {
   this.set = function (key, object) {
      localStorage[key] = JSON.stringify(object);
   };

   this.get = function (key) {
      return JSON.parse(localStorage[key]);
   };
});

答案 3 :(得分:1)

你无法在JS上真正做到这一点。您应该使用var boolValue = (stringValue !== 'false')或任何浮动您的船。

答案 4 :(得分:0)

更改此行:

e('checkbox').checked = localStorage['check-value'];

到此:

e('checkbox').checked = localStorage['check-value'] == "true";

或取决于你想要的东西:

e('checkbox').checked = localStorage['check-value'] != "false";

如果这样做了两次以上,请将布尔本地存储访问包装在一个只返回布尔值true或false的小函数中。

function tfStr(val) {
    return(val === "true");
}

答案 5 :(得分:0)

只是在这里徘徊,但你可以做一些真的愚蠢的

eval(localStorage['check-value'])

如果字符串为false,它将计算为布尔值false。显然你不想这样做,因为它是一个重大的安全漏洞。

或者你可以使用三元运算符:

(localStorage['check-value']==="false")?false:localStorage['check-value'];