我明显遗漏了一些明显的东西。
我只是想检查undefined。图像中的脚本是我所知道的用于检查未定义的每种方式,但是尽管您可以在监视中看到currentbusiness的值是" undefined",但脚本会进入最后的else语句。为什么脚本没有进入任何未定义的检查?
答案 0 :(得分:1)
因为值为"undefined"
(字符串,请注意引号)而不是undefined
。
浏览器存储(localStorage / sessionStorage)在存储时将所有内容强制转换为字符串,因此无论放入什么内容,都会返回一个字符串。
当您将undefined
强制转换为字符串时,您会获得"undefined"
:
console.log(
typeof String(undefined), // "string" this is what storage does to undefined
typeof undefined // "undefined"
);

您可以通过一次严格的比较currentBusiness === "undefined"
另一种选择是不存储undefined
值,这样在请求永不存储的值时,存储实际上会让您返回undefined
(而非"undefined"
)您的支票将按预期工作:
// assume currentBusiness was never stored in the first place
// because we chose not to store undefined values
localStorage["currentBusiness"] === undefined // true
值得指出的另一件事是你有多余的检查。
您的第一个if
条件
if (typeof currentBusiness === 'undefined' || !currentBusiness)
如果值的类型"undefined"
只有值undefined
,或者值为falsy,那么将为true,这意味着它是其中之一:"", 0, false, null, undefined, NaN
这意味着如果值为undefined
或任何虚假(由于undefined
已经是假的,这本身就是多余的),它将始终输入第一个if
和其他三个检查永远不会发生,因为他们都会检查一个虚假的价值。
事实上,只是一个虚假的检查将涵盖您的所有条件:
if (!currentBusiness) // this handles all your individual checks
答案 1 :(得分:1)
在右侧,您可以看到该值是字符串“undefined”,并且您不会在任何情况下检查该字符串:
所以你到了最后的'其他'部分
答案 2 :(得分:0)
localStorage
会将您放入其中的所有内容转换为字符串,因此其中包含字符串"undefined"
而不是值undefined
。您可以通常的方式检查:
if (currentBusiness === 'undefined') {
但最好还是修改将值设置为undefined
的任何内容,以便从localStorage
中删除:
if (valueToStore === undefined) {
localStorage.removeItem('currentBusiness');
} else {
localStorage.setItem('currentBusiness', valueToStore);
}