Не может установить булевы значения в LocalStorage?

Я заметил, что не могу установить булевы значения в 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? 
98
задан brasofilo 8 August 2019 в 23:59
поделиться

4 ответа

Реализация 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.

59
ответ дан 24 November 2019 в 05:16
поделиться

На данный момент все реализации Safari , WebKit, Chrome, Firefox и IE соответствуют старой версии стандарт WebStorage, где значение элементов хранения может быть только строкой.

Как вариант, можно использовать метод JSON parse и stringify для сериализации и десериализации данных, как я предлагал некоторое время. назад в другой вопрос , например:

var value = "true";
JSON.parse(value) === true; // true
80
ответ дан 24 November 2019 в 05:16
поделиться

Я не уверен, что LocalStorage может сохранять логические значения, но я могу сказать вам, что когда вы делаете alert("true" == true); он никогда не будет оцениваться как истинный, потому что вы неявно сравниваете строку с логической. Вот почему для установки логических значений вы используете true вместо "true".

1
ответ дан 24 November 2019 в 05:16
поделиться

Это связано с ответом CMS.

Вот небольшая функция, которую я использовал для разбора этой проблемы (функция будет продолжать делать то, что нужно, после того как реализации браузеров догонят спецификацию, так что не нужно помнить, что нужно менять код позже):

function parse(type) {
   return typeof type == 'string' ? JSON.parse(type) : type;
}
6
ответ дан 24 November 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: