2017-08-29 20 views
1

以下の実験関数(testIfFalsy)のswitch文と同様のswitch文を使用することを計画しています。私がそれに投げることを期待していた特定の数値の「偽り」です。私はスイッチ文「switch(true)」のこの形式はやや正統性がないことを知っていますが、スイッチの違法な使用ではなく、コードの可読性と私が使用しようとしているデータの種類の両方にとって非常に望ましいです一緒に。 BASICのcase文で前と同じことをやってきましたが、今では同じソースコードをJavascriptに移植しています。true/falseを評価するjs switch文の異常な動作

各スイッチのcase句内のコメントには、その句によってキャッチされた値がリストされます。私はこのコードから予期せぬ結果を得ました。まず、私がそれを書いたときに、 "default"節で捉えられた値を見過ごすことは決してありませんでした。なぜなら、それは前のcase節の両方を過ぎて真実でも偽でもないと解釈されたからです。しかし、コメントが示すように、本当にそのような価値がありました。

最も奇妙な結果は、数値リテラル1がどのように扱われるかです。 "if(a)"条件は、switch文の前に実行される "a is true"というアラートによってこのコードで示されるように、変数aがその値が数値1のときにtrueであると処理します。また、スイッチの「default」句の2番目のアラートでは「true」と表示され、「ブール(a)」という文も1の数値がtrueとして扱われます。だから、なぜこのswitch文はそれをtrueでもfalseでもないと扱っていますか?

function myCallingFunction() { 
    var R; 
    // unrelated code ... 
    // Tail end of calling function 
    R = testIfFalsy(0); 
} 

function testIfFalsy(a) { 
    if (a) {alert ("a is true");} 
    switch (true) { 
    case (!a): 
      alert ("it's true that a is false, a=" + a); 
    // when arg is: NaN, undefined, null, 0, -0, 0/0, false, !1 , '', R 
    // value shown= NaN, undefined, null, 0, 0, NaN, false, false, , undefined 
     break; 
    case (a): 
      alert ("it's true that a is true. a=" + a); 
    // when arg is: true, !0, 
    // value shown= true, true, 
     break; 
    default: 
      alert ("a is neither true nor false, a=" + a); 
      alert (Boolean(a)); 
    // when arg is: 1,2,-1,-2, 'cat', 'NaN', [0], 
    // value shown= 1,2,-1,-2, cat , NaN , 0 , 
    } 
} 
+0

switch(a == true)をtrueとし、falseをfalseにするのはなぜですか? – neuhaus

+2

'switch(true)'を使わないでください。 'if else if ...'はまったく同じ機能を持ち、読みやすさがはるかに優れています。 – Bergi

+1

['switch'は厳密な等価性を使用します](https://stackoverflow.com/q/6989902/1048572)。 'Boolean(a)'は 'a'と同じではありません。 – Bergi

答えて

2

わかりませんが、その理由は、スイッチが暗黙の強制を実行しないように見えるからです。 Boolean()は、ブール値以外の値を受け入れるように記述されているため、明示的と見なすこともできます。繰り返しますが、わかりませんが、素早いバイリンガルがその疑惑を確認するかもしれません。

+1

これは事実です:あなたは正しいです。そのため、このパターンは、ブール型に強制するすべてのケースの前に '!'を入れた 'switch(false)'として表現されることがあります(coffeescriptコンパイラによって顕著に表記される)。 –

関連する問題