使用枚举的JavaScript切换案例

时间:2012-10-08 14:18:31

标签: javascript enums switch-statement case

我有一个“枚举”声明如下:

var PlaceType = {
        PASSABLE_TERRAIN: 1,
        IMPASSABLE_TERRAIN: 0,
        SOMEWHAT_PASSABLE_TERRAIN: 2,
        PATH: 3
    };

和一个声明如下的函数:

setPlaceType(placeType) {
        this.clear = false;
        this.placeType = placeType;

        alert("before switch "+(PlaceType.SOMEWHAT_PASSABLE_TERRAIN==this.placeType));
        switch(this.placeType) {
        case PlaceType.PASSABLE_TERRAIN: {
            alert("Case PASSABLE");
            break;
        }
        case PlaceType.IMPASSABLE_TERRAIN: {
            alert("Case IMPASSABLE");
            break;
        }
        case PlaceType.SOMEWHAT_PASSABLE_TERRAIN: {
            alert("Case SOMEWHAT_PASSABLE");
            break;
        }
        case PlaceType.PATH: {
            alert("Case PATH");
            break;
        }
        default: {
            alert("case default");
        }
        }
    }

如果我这样称呼它:

setPlaceType(1);

我收到以下警告:“在切换为true之前”,“大小写默认值”

如果我这样称呼它:

setPlaceType(2);

我收到以下警告:“在切换假”之前,“大小写默认”

换句话说,使用正确的参数调用函数,当执行(在我看来)与开关相同的比较时,通过“==”我得到正确的行为,但切换从不将值与适当的大小写匹配。有人知道为什么吗?

5 个答案:

答案 0 :(得分:6)

如果任一运算符是字符串,则比较运算符会将两个操作数强制转换为字符串。如果你传入一个字符串,你将比较string == number,它将把数字转换成一个字符串,在传递字符串'2'的情况下,它将是真的。

switch case comparison使用标识运算符===,如果操作数不是同一类型,则会失败。

长话短说,如果您的案例与数字进行比较,请确保您总是传递一个数字,您可以像这样仔细检查:

setPlaceType(placeType) {
    if (typeof placeType !== 'number') {
        throw new Error('You must pass a number to setPlaceType!');
    }
    ...
}

另外,你应该像这样调用你的函数:

setPlaceType(PlaceType.PASSABLE_TERRAIN);

否则使用“枚举”(我使用松散的术语)对象并没有任何意义。

答案 1 :(得分:1)

匹配案例使用the === identity operator, not the == equality operator确定。表达式必须匹配,不进行任何类型转换。如果传入字符串而不是整数,则会失败。

setPlaceType(1);  //"Case PASSABLE"
setPlaceType("1");  //"case default"

使用以上行运行代码的示例:jsFiddle

因此,如果您说它失败了,您可能正在将字符串与数字进行比较。使用parseInt。

this.placeType = parseint(placeType,10);

答案 2 :(得分:1)

参考此=> Switch-Case for strings in Javascript not working as expected

切换执行===,而如果执行==

希望这有帮助!祝你有愉快的一天

答案 3 :(得分:0)

当您使用==进行比较时,js使用type-coercion将2个操作数强制转换为中间类型,在这种情况下为字符串,从而成功比较它们。

因此,要使效果与switch语句一起使用,您需要像

一样进行转换
this.placeType = parseint(placeType);

你还需要学习的是,使用==运算符比较javascript中的2个值并不是一个理想的做法,而是使用===运算符来检查类型到是相同的。所以在你的情况下,

alert("before switch "+(PlaceType.SOMEWHAT_PASSABLE_TERRAIN==this.placeType));
如果您在比较===int

时使用string,则

会失败

此处的演示演示:http://jsfiddle.net/pratik136/ATx8c/

答案 4 :(得分:0)

将枚举用于切换大小写的另一种方法:

   const PlaceType = Object.freeze({
            PASSABLE_TERRAIN: 1,
            IMPASSABLE_TERRAIN: 0,
            SOMEWHAT_PASSABLE_TERRAIN: 2,
            PATH: 3
        });

   function setPlaceType(placeType){
      return({
              0:"Case IMPASSABLE_TERRAIN",
              1:"Case PASSABLE_TERRAIN",
              2:"Case SOMEWHAT_PASSABLE_TERRAIN",
              3:"PATH"      
              }[placeType]);
     }