8

我有一个这样声明的“枚举”:

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);

我收到以下警报:“在 switch true 之前”,“case default”

如果我这样称呼它:

setPlaceType(2);

我收到以下警报:“在 switch false 之前”、“case default”

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

4

5 回答 5

8

如果任一运算符是字符串,则比较运算符会将两个操作数转换为字符串。如果您传入一个字符串,则您正在比较string == number哪个会将数字转换为字符串,并且在传递字符串的情况下'2',它将是真实的。

switch case 比较使用身份运算符===,如果操作数不是同一类型,则会失败。

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

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

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

setPlaceType(PlaceType.PASSABLE_TERRAIN);

否则,使用“枚举”(我松散地使用该术语)对象实际上没有任何意义。

于 2012-10-08T14:30:47.173 回答
1

匹配大小写是使用=== 标识运算符而不是 == 相等运算符确定的。表达式必须匹配,无需任何类型转换。如果您传递的是字符串而不是整数,它将失败。

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

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

所以如果你说它失败了,你可能是在比较一个字符串和一个数字。使用 parseInt。

this.placeType = parseint(placeType,10);
于 2012-10-08T14:24:17.970 回答
1

当您使用==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/

于 2012-10-08T14:30:27.563 回答
1

参考this => Switch-Case for Javascript中的字符串不能按预期工作

切换做一个===,而如果做一个==

希望这有帮助!祝你今天过得愉快

于 2012-10-08T14:31:22.407 回答
1

将枚举用于 switch case 的另一种方法:

   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]);
     }
于 2019-09-13T17:51:13.800 回答