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

次のアラートが表示されます:「true に切り替える前」、「デフォルトのケース」

このように呼び出すと:

setPlaceType(2);

次のアラートが表示されます:「スイッチ false の前」、「ケースのデフォルト」

言い換えれば、関数は適切な引数で呼び出されます。これは、スイッチと同じ比較を行うと (私にはそう思われます)、「==」を介して正しい動作が得られますが、スイッチは値と一致しません。適切なケースに。理由を知っている人はいますか?

4

5 に答える 5

8

いずれかの演算子が文字列の場合、比較演算子は両方のオペランドを文字列にキャストします。string == number文字列を渡す場合は、どちらが数値を文字列にキャストするかを比較しており、文字列を渡す場合は'2'true になります。

大文字と小文字の切り替え比較は同一性演算子===を使用し、オペランドが同じ型でない場合は失敗します。

簡単に言えば、ケースが数値と比較されている場合は、常に数値を渡していることを確認してください。次のように再確認できます。

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

==js を使用して比較を行っている場合type-coercion、2 つのオペランドを中間型 (この場合は文字列) にキャストするために使用しているため、正常に比較されます。

したがって、switch ステートメントで効果を得るには、そのようにキャストする必要があります。

this.placeType = parseint(placeType);

また、ここで学ばなければならないことは、演算子を使用して JavaScript で 2 つの値を比較することは実際には理想的な方法ではなく、型が同じであることもチェック==する演算子を使用することです。===だからあなたの場合、

alert("before switch "+(PlaceType.SOMEWHAT_PASSABLE_TERRAIN==this.placeType));

===を比較しているように使用した場合は失敗しますintstring

ここでの動作デモ: http://jsfiddle.net/pratik136/ATx8c/

于 2012-10-08T14:30:27.563 に答える
1

switch ケースに enum を使用する別の方法:

   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 に答える
1

一致するケースは、== 等価演算子ではなく、=== 同一性演算子を使用して決定されます。式は型変換なしで一致する必要があります。整数ではなく文字列を渡すと失敗します。

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

上記の行でコードを実行する例: jsFiddle

したがって、失敗していると言っている場合は、おそらく文字列と数値を比較しています。parseInt を使用します。

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

これを参照 => Javascript の文字列の Switch-Case が期待どおりに機能しない

スイッチは aを行いますが===場合は aを行い==ます。

この助けを願っています!ごきげんよう

于 2012-10-08T14:31:22.407 に答える