使用枚举的JavaScript切换案例

Shi*_*gon 6 javascript enums case switch-statement

我有一个"枚举"声明如下:

var PlaceType = {
        PASSABLE_TERRAIN: 1,
        IMPASSABLE_TERRAIN: 0,
        SOMEWHAT_PASSABLE_TERRAIN: 2,
        PATH: 3
    };
Run Code Online (Sandbox Code Playgroud)

和一个声明如下的函数:

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");
        }
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果我这样称呼它:

setPlaceType(1);
Run Code Online (Sandbox Code Playgroud)

我收到以下警告:"在切换为true之前","case default"

如果我这样称呼它:

setPlaceType(2);
Run Code Online (Sandbox Code Playgroud)

我收到以下警告:"在切换错误之前","大小写默认"

换句话说,使用正确的参数调用函数,当执行(在我看来)与开关相同的比较时,通过"=="我得到正确的行为,但是开关永远不会匹配值在适当的情况下.有人知道为什么吗?

jba*_*bey 6

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

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

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

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

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

setPlaceType(PlaceType.PASSABLE_TERRAIN);
Run Code Online (Sandbox Code Playgroud)

否则,使用"枚举"(我使用松散的术语)对象并没有任何意义.