Не удается установить логические значения в 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;}
}