55

如果我将对象传递给 case 语句,并且存在未定义的情况,我可以处理这种情况吗?如果是,那怎么办?如果不可能,那么处理开关的未定义案例的最佳实践是什么?

4

4 回答 4

70

为. case_undefined

case undefined:
  // code
  break;

或者,如果所有其他选项都已用尽,请使用default.

default:
  // code
  break;

注意:为避免错误,switch必须声明提供给的变量,但可以有一个undefined值。参考这个fiddle并阅读更多关于JavaScript 中已定义和未定义变量的信息。

于 2012-10-02T18:28:24.450 回答
3

好吧,最可移植的方法是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变量全局状态的集成问题......

于 2012-10-02T20:26:51.037 回答
2

如果您正在比较对象引用,但变量可能没有被赋值,那么它会像任何其他情况一样简单地使用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");
}
于 2012-10-02T18:31:38.157 回答
0

因为undefined真的只是另一个'undefined' in window === 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;
}

工作刚刚好。

于 2012-10-02T18:29:05.917 回答