ЯШ: Может ли "ложь" быть приведена к ложному типу? - PullRequest
2 голосов
/ 06 июля 2011

При использовании 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'];
})();

Но похоже, что 'check-value' будет хранить что-то вроде "false", если флажок не установлен и строка "false"получает приведение типа к true в этой строке до последней.Я знаю, что могу сделать небольшой тест if, но это для хобби-проекта, и я хочу выяснить это, если это возможно.Можно ли "false" привести к false?

Я не использую библиотеки для этого btw, потому что это расширение chrome, и я хочу, чтобы оно было легким.

Ответы [ 6 ]

3 голосов
/ 06 июля 2011

Вы можете проверить, равна ли она строке «ложь»:

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

В качестве альтернативы, вы можете привести ее к числу до того, как сохраните его и после того, как получите его:

localStorage['check-value'] = +e('checkbox').checked
// ...
e('checkbox').checked = +localStorage['check-value']
3 голосов
/ 06 июля 2011

«false» - это просто строка, как и любая другая, вам необходимо выполнить свою собственную проверку здесь.

2 голосов
/ 06 июля 2011

Вы можете попробовать использовать 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]);
   };
});
1 голос
/ 06 июля 2011

Вы не можете сделать это на JS. Вы должны использовать var boolValue = (stringValue !== 'false') или все, что плавает на вашей лодке.

0 голосов
/ 06 июля 2011

Просто риффинг здесь, но вы могли бы сделать что-то действительно глупо, как

eval(localStorage['check-value'])

Если строка ложна, она будет равна булеву ложь.Очевидно, вы не хотите этого делать, поскольку это серьезная дыра в безопасности.

В качестве альтернативы вы можете использовать троичный оператор:

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

0 голосов
/ 06 июля 2011

Изменить эту строку:

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");
}
...