0

私は次のスイッチブロックを持っています:

    var str = 'matches[pw1]';

    switch (str)
    {
        case (str.indexOf('matches') > -1) :
            console.log('yes');
        break;

       default:
           console.log(str.indexOf('matches') ) ;
           console.log('no');
        break;
    }

私が欲しいのは、str「matches」という単語が含まれている場合は、最初のcaseブロックを実行する必要があり、そうでない場合はデフォルトのブロックを実行する必要があります。

ただし、これを実行すると、取得する出力は「0」、次に「no」になります。これは、最初のケースの条件が満たされているにもかかわらず、デフォルトのブロックが実行されていることを意味します。

何が問題なのですか?

4

5 に答える 5

3

あなたcaseはおそらくテストしているかどうか(str.indexOf('matches') > -1) == str


編集:

switch何をcase意味するのかを正確に理解することは価値があるかもしれません。Javascriptの祖先の1つであるCは、プリミティブが値のリスト(多くの場合、エレーションまたは一連のリテラルswitchから)と比較されていたコードのブロックを置き換えるために一般的に使用されます。enumしたがって、代わりに:

if (type == ENABLE_FRAMISTAN)
{
   enable_framistan();
}
else if (type == ENABLE_FROBSOSTICATOR)
{
   enable_frobnosticator();
}
else if (type == DISABLE_BAZTICULATOR)
{
   disable_bazticulator();
}
else
{
   assert(false);
}

代わりに次のように書くことができます。

switch (type)
{
    case ENABLE_FRAMISTAN:      enable_framistan(); break;
    case ENABLE_FROBNOSTICATOR: enable_frobnosticator(); break;
    case DISABLE_BAZTICULATOR:  disable_bazticulator(); break;
    default: assert(false);  break;
}

type...これにより、呼び出されている関数(またはそのような関数)に値を効果的にマッピングするコードの大きなブロックを簡単に消化(およびエラーを特定)できる可能性があります。指定された使用法は、文字列がいくつかの潜在的な(互いに排他的な?)パターンのいずれかに一致するかどうかを確認するために、にマップされませんswitchswitchそれが単にテストされている平等であるならば、それはうまくいくでしょう、しかしあなたの状態は表現するように設計されたより洗練されています。switch機能セットを維持するために管理する方法では、自明ではないコードが必要になる可能性があります

于 2012-08-01T01:35:46.603 に答える
2

ifステートメントを使用してみませんか?次のようなものを試してください:

 var str = 'matches[pw1]';



    if(str.indexOf('matches') > -1) {
        console.log('yes');
       break;
   }else{
       console.log(str.indexOf('matches') ) ;
       console.log('no');
       break;
  }

とにかく多くのケースがないので、それはうまくいくはずです。場合によっては比較できないと思います。

于 2012-08-01T01:36:54.860 に答える
1

私が欲しいのは、strに「matches」という単語が含まれている場合は、最初のcaseブロックを実行する必要があり、それ以外の場合はデフォルトのブロックを実行する必要があります。

switchステートメントではそれを行うことはできません。switchステートメントは、switch式(この場合str)を評価した結果をcaseラベルの値と比較します。ケースラベルは(例のように)式にすることができますが、式の場合は、を使用して評価され、上記の値と比較されます===。(それはECMAScript 5.1仕様が言っていることです...)

したがって、その場合にコードが実際に行っていることは(大まかに言えば):

  • (str.indexOf('matches') > -1)どちらがあなたに与えるかをtrue評価するfalse
  • trueまたは...falseの値と比較しstrます。これは失敗し、ケース本体は実行されません。

今、私はあなたがあなたのアプローチを次のように機能させることができると思います:

case (str.indexOf('matches') > -1 ? str : '') :
        console.log('yes');
    break;

しかし、それはコードの可読性の観点(IMO)からは悪臭を放ちます。

于 2012-08-01T01:52:14.443 に答える
0

あなたはこれを行うことができます:

console.log( str.indexOf( 'matches' ) > -1 ? 'yes' : 'no' );
于 2012-08-01T01:38:17.340 に答える
0

スイッチの基本的な使い方を知っておく必要があります。誤ってSwitchを使っていると思います。次のように使用してみてください。

var str = 'matches[pw1]';
str = str.indexOf('matches');
switch (str)
    {
        case  -1 :
            console.log('yes');
        break;

       default:
           console.log(str.indexOf('matches') ) ;
           console.log('no');
        break;
    }

次のURLをご覧くださいhttp://www.w3schools.com/js/js_switch.asp

上記がロジックに適していない場合は、if .. else if... http://www.w3schools.com/js/js_if_else.aspを使用してください。

于 2012-08-01T01:46:36.177 に答える