在JavaScript中的switch语句中,我能处理“undefined”情况吗?

65
如果我正在向一个 case 语句传递一个对象,并且存在一个未定义的 case,我能处理这种情况吗?如果可以,那该怎么做?如果不可能,那处理 switch 中未定义 case 的最佳实践是什么?

2
为什么在这种情况下 default 无法工作? - jcolebrand
我之前从未听说过 MDN。谢谢你提供这个信息。它对未来的 JS 问题会很有用。 - egucciar
我有一个问题,只是没想到它会与“未声明”的值一起工作,所以我想看看这里是否有人知道。但显然,在JS世界中,“undefined”有两个不同的含义,一个可以在case语句中使用,另一个则会在运行时出错。这并不是那么直观。 - egucciar
有没有更“函数式”的 switch 语句版本? - egucciar
1
不,有 typeof var == 'undefined'var === undefinedvar == undefined,它们都有明确的含义。 - jcolebrand
好的,所以还有一个意思我之前不知道... - egucciar
4个回答

82

添加一个 undefinedcase

case undefined:
  // code
  break;

如果其他选项都无法使用,则使用default

default:
  // code
  break;

注意:为了避免错误,在使用switch时,变量必须被声明,但可以具有undefined值。请参考此fiddle并阅读更多关于JavaScript中已定义和未定义变量的信息。

我认为这回答了我的问题。我只是不太确定未定义的变量是否会在 switch 语句中导致意外行为。谢谢! - egucciar
变量必须要被 声明,即 var myvar。否则会出现错误。 - Jason McCreary
4
你知道 undefined 可以被赋值吗?我的意思是毕竟它是 JavaScript 嘛 ;-) - PeeHaa
我认为你在这里有两个不同的问题。一个是被问到的问题,另一个则是关于你框架设计的更高层次的问题。 - Jason McCreary
有什么我错过的东西吗?几周前我开始学习JS时,我认为重新定义undefined是JS中一个古怪且糟糕的事情,你要尽一切可能避免...我不明白为什么会有人这样使用这种语言。它似乎很危险。 - egucciar
显示剩余5条评论

4

最便携的方法是在闭包中定义一个新变量undefined,这样您可以完全避免当某人在代码库中使用undefined = 1;(作为全局变量)的情况,这将完全破坏大多数实现。

(function() {
    var foo;
    var undefined;

    switch (foo) {
        case 1:
            //something
            break;
        case 2:
            //something
            break;
        case undefined:
            // Something else!
            break;
        default:
            // Default condition
    }
})();

通过显式声明变量,您可以避免依赖全局状态的undefined变量而导致的集成问题...


2
下投票者:对于投票反对的理由,有什么评论吗?这个回答可以改进吗?你是否持有基本观点不同意?至少值得讨论的问题是什么? - ircmaxell

3

如果您正在比较对象引用,但变量可能没有被赋值,则它将像任何其他情况一样简单地使用 undefined

var obs = [
    {},
    {}
];

var ob = obs[~~(Math.random() * (obs.length + 1))];

switch(ob) {
    case obs[0]: 
        alert(0); 
        break;
    case obs[1]:
        alert(1); 
        break;
    case undefined: 
        alert("Undefined"); 
        break;
    default: alert("some unknown value");
}

1
谢谢@jcolebrand。我没有考虑到我已经排除了0 - I Hate Lazy

0

由于undefined实际上只是另一个window中的'undefined' === true),因此您可以检查它。

var foo;

switch( foo ) {
    case 1:
        console.log('1');
        break;
    case 2:
        console.log('2');
        break;
    case 3:
        console.log('3');
        break;
    case undefined:
        console.log('undefined');
        break;
}

运行得差不多正确。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接