首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用枚举的JavaScript切换案例

问使用枚举的JavaScript切换案例
EN

Stack Overflow用户
提问于 2012-10-08 22:18:31
回答 5查看 21.2K关注 0票数 8

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

代码语言:javascript
复制
var PlaceType = {
        PASSABLE_TERRAIN: 1,
        IMPASSABLE_TERRAIN: 0,
        SOMEWHAT_PASSABLE_TERRAIN: 2,
        PATH: 3
    };

和一个如下声明的函数:

代码语言:javascript
复制
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");
        }
        }
    }

如果我这样称呼它:

代码语言:javascript
复制
setPlaceType(1);

我收到以下警告:“在切换为真之前”,“默认情况下”

如果我这样称呼它:

代码语言:javascript
复制
setPlaceType(2);

我收到以下警告:“切换前为假”、“大小写默认”

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-10-08 22:30:47

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

切换大小写比较使用标识运算符===,如果操作数不是同一类型,则切换大小写比较将失败。

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

代码语言:javascript
复制
setPlaceType(placeType) {
    if (typeof placeType !== 'number') {
        throw new Error('You must pass a number to setPlaceType!');
    }
    ...
}

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

代码语言:javascript
复制
setPlaceType(PlaceType.PASSABLE_TERRAIN);

否则,使用“枚举”(我使用这个术语不严格)对象就没有任何意义了。

票数 8
EN

Stack Overflow用户

发布于 2012-10-08 22:24:18

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

代码语言:javascript
复制
setPlaceType(1);  //"Case PASSABLE"
setPlaceType("1");  //"case default"

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

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

代码语言:javascript
复制
this.placeType = parseint(placeType,10);
票数 1
EN

Stack Overflow用户

发布于 2012-10-08 22:30:28

当您使用== js进行比较时,就是使用type-coercion将两个操作数转换为中间类型,即本例中的string,从而成功地比较它们。

因此,为了使switch语句发挥作用,您需要这样进行强制转换

代码语言:javascript
复制
this.placeType = parseint(placeType);

您还需要了解的是,使用==运算符比较javascript中的2个值并不是一个理想的做法,而是使用===运算符,该运算符也会检查类型是否相同。所以在你的情况下,

代码语言:javascript
复制
alert("before switch "+(PlaceType.SOMEWHAT_PASSABLE_TERRAIN==this.placeType));

如果您在比较int和string时使用===,则会失败

工作演示:http://jsfiddle.net/pratik136/ATx8c/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12783610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档