Реализация хранилища в Firefox может хранить только строки, но сентябре 2009 года W3C изменил черновик, чтобы принимать любые данные.Реализация (все еще) еще не догнала( см. Правка ниже ).
Итак, в вашем случае логическое значение преобразуется в строку.
Что касается того "true" != true
, почему , как написано в описании Equal ( ==
) в MDC *:
Если два операнда не одного типа, JavaScript преобразует операнды, а затем применяет строгое сравнение. Если один из операндов является числом или логическим значением, операнды по возможности преобразуются в числа ; иначе, если один из операндов является строкой, другой операнд преобразуется в строку, если это возможно.
Обратите внимание, что строка преобразуется в число вместо логического . Поскольку "true"
преобразовано в число NaN
, оно не будет равно ничему, поэтомуfalse
возвращается.
(*: Фактический стандарт см. В ECMA-262 §11.9.3 «Абстрактный алгоритм сравнения равенства»)
Edit:setItem
интерфейс был вернулся принимать строки только на сентябрь 1 - го проекта 2011 года в соответствии с поведением существующих реализаций, так как ни один из поставщиков не заинтересованы в поддержке хранящих не-строк. Подробнее см. Https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111 .
На данный момент все реализации Safari , WebKit, Chrome, Firefox и IE соответствуют старой версии стандарта WebStorage, где значение элементов хранилища может быть только строкой.
Можно было бы использовать JSON
parse
иstringify
метод для сериализации и десериализации данных, как я предлагал некоторое время назад в другом вопросе , например:источник
value
недействительна JSON (напримерJSON.parse("a random string")
)Мои решения:
источник
true == 'true'
естьfalse
.localStorage.getItem(pre)==='true'
без остальногоЭто связано с ответом CMS.
Вот небольшая функция, которую я использовал для обработки части синтаксического анализа этой проблемы (функция будет продолжать делать правильную вещь после того, как реализации браузера догонят спецификацию, поэтому не нужно помнить об изменении кода позже):
источник
Используйте store.js :
↓
источник
Я не уверен, может ли LocalStorage сохранять логические значения, но могу сказать вам, что когда вы это сделаете,
alert("true" == true);
он никогда не будет оценивать значение true, потому что вы неявно сравниваете строку с логическим значением. Вот почему для установки логических значений вы используетеtrue
вместо"true"
.источник
"1" === 1
на самом деле вернет false.eval
в некоторых случаях может использоваться с осторожностью .источник
eval
так как это может быть небезопасно. ПредпочитаюJSON.parse("true")
.Обычно я просто сохраняю значение в LocalStore как логическое значение, а затем извлекаю его методом синтаксического анализа, чтобы быть уверенным во всех браузерах. Мой метод ниже настроен для моей бизнес-логики. Иногда я могу хранить что-то как `` нет '' и мне все равно нужно
false
взаменисточник