Я заметил, что не могу установить булевы значения в localStorage
?
localStorage.setItem("item1", true);
alert(localStorage.getItem("item1") + " | " + (localStorage.getItem("item1") == true));
Всегда предупреждения true | false
когда я пытаюсь протестировать localStorage.getItem("item1") == "true"
это предупреждает верный... Как я могу установить объект в localStorage
к истинному?
Даже если это - строка, я думал только ===
проверил бы тип?
Так
alert("true" == true); // should be true?
Реализация Storage в Firefox может хранить только строки, но 2009 сентября W3C изменил проект, чтобы он мог принимать любые данные. Реализация (все еще) не догнана (см. Edit ниже).
Поэтому в вашем случае булево значение преобразуется в строку.
Что касается того, почему "true" != true
, то, как написано в описании Equal (==
) в MDC*:
Если два операнда не одного типа, JavaScript преобразует операнды, а затем применяет строгое сравнение. Если один из операндов является числом или булевой функцией, операнды преобразуются в числа, если это возможно; если же один из операндов является строкой, другой операнд преобразуется в строку, если это возможно.
Обратите внимание, что строка преобразуется в число, а не в булево. Поскольку "true"
, преобразованное в число, равно NaN
, оно не будет равно ничему, поэтому возвращается false
.
(*: Фактический стандарт см. в ECMA-262 §11.9.3 "The Abstract Equality Comparison Algorithm")
Правка: Интерфейс setItem
был изменен на принимающий только строки в 2011 Sept 1st draft, чтобы соответствовать поведению существующих реализаций, поскольку никто из производителей не заинтересован в поддержке хранения нестрок. Подробности см. в https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111.
На данный момент все реализации Safari , WebKit, Chrome, Firefox и IE соответствуют старой версии стандарт WebStorage, где значение элементов хранения может быть только строкой.
Как вариант, можно использовать метод JSON parse
и stringify
для сериализации и десериализации данных, как я предлагал некоторое время. назад в другой вопрос , например:
var value = "true";
JSON.parse(value) === true; // true
Я не уверен, что LocalStorage может сохранять логические значения, но я могу сказать вам, что когда вы делаете alert("true" == true);
он никогда не будет оцениваться как истинный, потому что вы неявно сравниваете строку с логической. Вот почему для установки логических значений вы используете true
вместо "true"
.
Это связано с ответом CMS.
Вот небольшая функция, которую я использовал для разбора этой проблемы (функция будет продолжать делать то, что нужно, после того как реализации браузеров догонят спецификацию, так что не нужно помнить, что нужно менять код позже):
function parse(type) {
return typeof type == 'string' ? JSON.parse(type) : type;
}