JavaScript没有从localStorage捕获undefined

时间:2017-02-04 06:39:14

标签: javascript html if-statement

我明显遗漏了一些明显的东西。

我只是想检查undefined。图像中的脚本是我所知道的用于检查未定义的每种方式,但是尽管您可以在监视中看到currentbusiness的值是" undefined",但脚本会进入最后的else语句。为什么脚本没有进入任何未定义的检查?

enter image description here

3 个答案:

答案 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”,并且您不会在任何情况下检查该字符串:

  1. typeof ... - >类型是字符串
  2. 值未定义
  3. 值不为空
  4. (!...) - >价值是真实的
  5. 所以你到了最后的'其他'部分

答案 2 :(得分:0)

localStorage会将您放入其中的所有内容转换为字符串,因此其中包含字符串"undefined"而不是值undefined。您可以通常的方式检查:

if (currentBusiness === 'undefined') {

但最好还是修改将值设置为undefined的任何内容,以便从localStorage中删除:

if (valueToStore === undefined) {
    localStorage.removeItem('currentBusiness');
} else {
    localStorage.setItem('currentBusiness', valueToStore);
}