以下の実験関数(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 ,
}
}
switch(a == true)をtrueとし、falseをfalseにするのはなぜですか? – neuhaus
'switch(true)'を使わないでください。 'if else if ...'はまったく同じ機能を持ち、読みやすさがはるかに優れています。 – Bergi
['switch'は厳密な等価性を使用します](https://stackoverflow.com/q/6989902/1048572)。 'Boolean(a)'は 'a'と同じではありません。 – Bergi