Ложная переменная не проверяется как ложная - PullRequest
0 голосов
/ 09 октября 2018

У меня возникают проблемы с пониманием странного поведения в моем коде, и мне интересно, кто-нибудь может сказать мне, что я делаю неправильно?

У меня есть логическая переменная isWaiting, и она сохраняется как false в localStorage, и когда он получен, он отображается как false, но когда вы делаете проверку, он не видит это таким образом.Вот небольшой код для репликации моей проблемы:

(function(){
    localStorage.setItem("isWaiting", false);
    var isWaiting = localStorage.getItem("isWaiting");
    console.log("isWaiting = " + isWaiting)
    console.log("Is isWaiting False? " + Boolean(isWaiting === false));
    // I have tried it as this as well
    console.log("Is isWaiting False? " + (isWaiting === false));
})()

Должен получить:

isWaiting = false

Является ли isWaiting False?true

Производит:

isWaiting = false

isWAiting False?false ⬅ Это явно неправильно , так почему это происходит?

Что я делаю не так?Является ли логическое значение false каким-либо образом искаженным в процессе localStorage, и если да, то как бы я его учел, если нет, то что не так?


Решение Обновление: 10/09 /18

Основываясь на любезных ответах, помогающих мне подтвердить, что мое подозрение, что процесс LS уничтожает тип значения, было верным, и, более конкретно, решение, предоставленное @ bhojendra-rauniyar, я изменил код, чтобы исправитьвведите прямо в момент поиска, а затем обработайте его как обычно во всем коде, избегая тонны добавленного кода, и, кажется, он добился цели, спасибо всем за вашу помощь.

...
    var isWaiting = Boolean(JSON.parse(localStorage.getItem("isWaiting")));
...

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

localstorage устанавливает значения в виде строки.В вашем примере Boolean (isWaiting === false) -> false, но если вы проверите Boolean(isWaiting === 'false') ->, это даст вам true

0 голосов
/ 09 октября 2018

LocalStorage сохранит значения в строке, и вы не можете сравнить строку с логическим значением.Поэтому вам нужно сравнить это так:

(function(){
    localStorage.setItem("isWaiting", false);
    var isWaiting = localStorage.getItem("isWaiting");
    console.log("isWaiting = " + isWaiting)
    console.log("Is isWaiting False? " + Boolean(isWaiting === 'false'));
    // I have tried it as this as well
    console.log("Is isWaiting False? " + (isWaiting === 'false'));
})()
0 голосов
/ 09 октября 2018

Локальное хранилище хранит значение в строке.Таким образом, даже если вы используете Boolean('false'), вернет true.Потому что это не пустая строка.Все, что имеет значение в строке, должно быть true.Чтобы обойти это, вы можете использовать:

Boolean(JSON.parse('false')) // false
Boolean(JSON.parse('true')) // true

Итак, вы можете сделать:

Boolean(JSON.parse(isWaiting))

В качестве альтернативы, вы также можете сравнить со строкой:

String(false) === 'false' // true

Итак, используя:

console.log(String(isWaiting)) // will return false
...