Javascript 假变量不';t验证为假

Javascript 假变量不';t验证为假,javascript,local-storage,logical-operators,Javascript,Local Storage,Logical Operators,我很难理解代码中的一些奇怪行为,我想知道是否有人能告诉我我做错了什么 我有一个布尔变量isWaiting,它被保存为localStorage中的false,当检索到它时,它显示为false,但当您进行验证时,它不会这样看。下面是一个复制我的问题的小代码: (function(){ localStorage.setItem("isWaiting", false); var isWaiting = localStorage.getItem("isWaiting"); cons

我很难理解代码中的一些奇怪行为,我想知道是否有人能告诉我我做错了什么

我有一个布尔变量
isWaiting
,它被保存为
localStorage
中的
false
,当检索到它时,它显示为
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

等待是假的吗?假的⬅ 这显然是错误的,那么为什么会发生这种情况呢

我做错了什么?false的布尔值是否在
localStorage
过程中被损坏了?如果是这样,我将如何解释它,如果不是,那么有什么问题


解决方案更新:10/09/18 根据善意的回复,帮助我确认我对LS流程正在屠杀值类型的怀疑是正确的,更具体地说是@bhojendra rauniyar提供的解决方案,我已经更改了代码,以便在检索时更正类型,然后在整个代码中按正常方式处理,避免了大量添加的代码,而且似乎已经完成了操作,谢谢大家的帮助

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

本地存储器以字符串形式存储该值。因此,即使使用
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
将值设置为字符串。 在你的例子中 布尔值(isWaiting==false)->false 但是如果你检查一下
Boolean(isWaiting==“false”)
->这将为您提供true

本地存储将在字符串中保存值,并且您无法将字符串与布尔值进行比较。所以你需要这样比较:

(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'));
})()

另一个有用的线程@Narendra感谢你链接它,这是一个重复的线程,但在兔子洞之后,我发现()这表明了一个原因,但它在2010年发布,它仍然成立吗?我想知道?好吧,你建议只验证字符串本身,谢谢你,我没想到LS只会改变所有字符串,活到老学到老。是的,谢谢你,Narendra提供了同样的技术,Bhojendra提供了另一种选择,所以我想我现在可以得到应得的回报。谢谢你,虽然下面其他人提出的解决方案代码更少,但我想我喜欢你的方法的稳定性和可靠性。我将尝试并测试代码修复,如果这解决了它,那么我将很快回来标记它。