Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用enum的JavaScript切换案例_Javascript_Enums_Switch Statement_Case - Fatal编程技术网

使用enum的JavaScript切换案例

使用enum的JavaScript切换案例,javascript,enums,switch-statement,case,Javascript,Enums,Switch Statement,Case,我有一个“enum”声明如下: var PlaceType = { PASSABLE_TERRAIN: 1, IMPASSABLE_TERRAIN: 0, SOMEWHAT_PASSABLE_TERRAIN: 2, PATH: 3 }; 函数声明如下: setPlaceType(placeType) { this.clear = false; this.placeType = placeTy

我有一个“enum”声明如下:

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);
setPlaceType(2);
setPlaceType(placeType) {
    if (typeof placeType !== 'number') {
        throw new Error('You must pass a number to setPlaceType!');
    }
    ...
}
setPlaceType(PlaceType.PASSABLE_TERRAIN);
如果我这样称呼它:

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);
setPlaceType(2);
setPlaceType(placeType) {
    if (typeof placeType !== 'number') {
        throw new Error('You must pass a number to setPlaceType!');
    }
    ...
}
setPlaceType(PlaceType.PASSABLE_TERRAIN);
我收到以下警报:“切换前为真”、“案例默认”

如果我这样称呼它:

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);
setPlaceType(2);
setPlaceType(placeType) {
    if (typeof placeType !== 'number') {
        throw new Error('You must pass a number to setPlaceType!');
    }
    ...
}
setPlaceType(PlaceType.PASSABLE_TERRAIN);
我收到以下警报:“切换前错误”,“案例默认”


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

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

setPlaceType(1);  //"Case PASSABLE"
setPlaceType("1");  //"case default"
使用上述行运行代码的示例:

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

this.placeType = parseint(placeType,10);

使用
=
js进行比较时,js使用
类型强制
将两个操作数强制转换为中间类型,在本例中为string,从而成功比较它们

因此,为了获得使用switch语句的效果,您需要这样进行强制转换

this.placeType = parseint(placeType);
这里还需要了解的是,使用
=
操作符比较javascript中的两个值并不是一种理想的做法,而是使用
==
操作符,该操作符还检查类型是否相同。所以在你的情况下

alert("before switch "+(PlaceType.SOMEWHAT_PASSABLE_TERRAIN==this.placeType));
如果在比较
int
字符串时使用
==
,则会失败


此处的工作演示:

如果其中一个运算符是字符串,则比较运算符将两个操作数强制转换为字符串。如果传入字符串,则比较将数字转换为字符串的
string==number
,如果传入字符串
'2'
,则为true

开关大小写比较使用标识运算符
==
,如果操作数的类型不同,则比较将失败

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

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);
setPlaceType(2);
setPlaceType(placeType) {
    if (typeof placeType !== 'number') {
        throw new Error('You must pass a number to setPlaceType!');
    }
    ...
}
setPlaceType(PlaceType.PASSABLE_TERRAIN);
此外,您应该像这样调用函数:

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);
setPlaceType(2);
setPlaceType(placeType) {
    if (typeof placeType !== 'number') {
        throw new Error('You must pass a number to setPlaceType!');
    }
    ...
}
setPlaceType(PlaceType.PASSABLE_TERRAIN);
否则,使用“枚举”(我松散地使用该术语)对象实际上没有任何意义。

参考此=>

开关执行
==
,而如果执行
=


希望这有帮助!祝您度过愉快的一天

另一种将枚举用于交换机机箱的方法:

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

它对我有用:您确定要传递一个int吗?您是否通过调试器来运行它,以查看Javascript对Case块中比较值的运行时类型(或入站值)的看法?只是想知道这是否是一个微妙的胁迫问题?(在黑暗中拍摄)您是否有可能从HTML页面调用此函数并传入输入文本框的value属性?那肯定会发送一个字符串…谢谢,就这样。但是“==”检查通过,而开关检查不通过,这一事实实际上是违反直觉的。我现在明白了开关实际上会做一个“===”检查,但仍然是这样。好吧,是的,因为它也解释了“==”和“===”,我认为如果他/她在这个问题上绊倒的话,它会对其他像我这样的超级noob更有帮助。我可能错了,但我认为在javascript中,类型强制总是尝试在数量上强制转换这两个类型,除非它们是相同的类型;不在字符串中。请阅读这篇好文章:我如何使用上述场景来处理未定义或等于或大于4的值