Не удается установить логические значения в 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?
Ответы
Ответ 1
Реализация Firefox в хранилище может хранить только строки, но на 2009 сентябрь, W3C изменил проект, чтобы принять любые данные. Реализация (все еще) еще не завершена (см. раздел "Редактировать" ниже).
Итак, в вашем случае логическое значение преобразуется в строку.
Как почему "true" != true
, как написано в описание Equal (==
) в MDC *:
Если два операнда не одного типа, JavaScript преобразует операнды, а затем применяет строгое сравнение. Если любой операнд является числом или логическим, операнды преобразуются в числа, если это возможно; else, если любой операнд является строкой, другой операнд, если возможно, преобразуется в строку.
Обратите внимание, что строка преобразуется в число вместо Boolean. Поскольку "true"
, преобразованный в число, равен NaN
, он не будет ничем иным, поэтому возвращается false
.
(*: для фактического стандарта см. ECMA-262 & sect; 11.9.3 "Алгоритм сравнения абстрактного равенства" )
Изменить: Интерфейс setItem
был возвращен, чтобы принимать строки только на 2011 1 сентября проект для соответствия поведение существующих реализаций, так как ни один из поставщиков не заинтересован в поддержке хранения строк. Подробнее см. https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111.
Ответ 2
На данный момент все реализации Safari, WebKit, Chrome, Firefox и IE соответствуют старой версии стандарта WebStorage. где значение элементов хранения может быть только строкой.
Можно было бы использовать методы JSON parse
и stringify
для сериализации и десериализации данных, как я предлагал некоторое время назад в другом вопросе, например:
var value = "true";
JSON.parse(value) === true; // true
Ответ 3
Мои решения:
function tytPreGetBool(pre) {
return localStorage.getItem(pre) === 'true';
}
Ответ 4
Это связано с ответом CMS.
Вот небольшая функция, которую я использовал для обработки части этой проблемы (функция продолжит делать правильные вещи после того, как реализации браузера догонят спецификацию, поэтому не нужно помнить, чтобы изменить код позже):
function parse(type) {
return typeof type == 'string' ? JSON.parse(type) : type;
}
Ответ 5
Используйте store.js:
localStorage.setItem('isUser', true)
localStorage.getItem('isUser') === "true" //true
npm i -D store
↓
store.get('isUser') //true
Ответ 6
Я не уверен, что LocalStorage может сохранять логические значения, но могу сказать, что когда вы выполняете alert("true" == true);
, он никогда не будет оценивать true, потому что вы неявно сравниваете строку с логическим. Вот почему для установки булевых значений вы используете true
вместо "true"
.
Ответ 7
eval
также можно использовать осторожно в некоторых случаях.
console.log(eval("true") === true) //true
Ответ 8
То, что я обычно делаю, просто сохранить значение в LocalStore как логическое, а затем получить с помощью метода синтаксического анализа, просто для всех браузеров. Мой метод ниже настроен для моей бизнес-логики. Иногда я мог бы хранить smth как "нет" и все равно нуждаться в false
в обратном порядке
function toBoolean(str) {
if (typeof str === 'undefined' || str === null) {
return false;
} else if (typeof str === 'string') {
switch (str.toLowerCase()) {
case 'false':
case 'no':
case '0':
case "":
return false;
default:
return true;
}
} else if (typeof str === 'number') {
return str !== 0
}
else {return true;}
}