错误的变量不会验证为错误
A false Variable Doesn't Validate as false
我无法理解代码中的一些奇怪行为,我想知道是否有人可以告诉我我做错了什么?
我有一个布尔变量 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
Is isWaiting False? true
产生:
isWaiting = false
Is isWaiting False? false ⬅ This is clearly wrong, so why is this happening?
我做错了什么? false 的布尔值是否在 localStorage
过程中以某种方式被破坏,如果是,我将如何解释它,如果不是,那是什么问题?
解决方案 Update:10/09/18
基于帮助我确认我对 LS 进程正在屠杀值类型的怀疑确实是正确的,更具体地说,@bhojendra-rauniyar 提供的解决方案,我已经更改了代码以更正类型
在检索的那一刻,然后在整个代码中正常处理它,避免添加大量代码,它似乎已经成功了,感谢大家的帮助。
...
var isWaiting = Boolean(JSON.parse(localStorage.getItem("isWaiting")));
...
本地存储以字符串形式存储值。所以,即使你使用 Boolean('false')
也会 return 为真。因为它不是空字符串。字符串中任何有价值的东西都是 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
localstorage 将值设置为字符串。
在你的例子中
布尔值(isWaiting === false)-> false
但如果你检查
Boolean(isWaiting === 'false')
-> 这会给你 true
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'));
})()
我无法理解代码中的一些奇怪行为,我想知道是否有人可以告诉我我做错了什么?
我有一个布尔变量 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
Is isWaiting False? true
产生:
isWaiting = false
Is isWaiting False? false ⬅ This is clearly wrong, so why is this happening?
我做错了什么? false 的布尔值是否在 localStorage
过程中以某种方式被破坏,如果是,我将如何解释它,如果不是,那是什么问题?
解决方案 Update:10/09/18
基于帮助我确认我对 LS 进程正在屠杀值类型的怀疑确实是正确的,更具体地说,@bhojendra-rauniyar 提供的解决方案,我已经更改了代码以更正类型
在检索的那一刻,然后在整个代码中正常处理它,避免添加大量代码,它似乎已经成功了,感谢大家的帮助。
...
var isWaiting = Boolean(JSON.parse(localStorage.getItem("isWaiting")));
...
本地存储以字符串形式存储值。所以,即使你使用 Boolean('false')
也会 return 为真。因为它不是空字符串。字符串中任何有价值的东西都是 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
localstorage 将值设置为字符串。
在你的例子中
布尔值(isWaiting === false)-> false
但如果你检查
Boolean(isWaiting === 'false')
-> 这会给你 true
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'));
})()