353

私はjsfiddle.netで遊んでいましたが、なぜこれがtrueを返すのか興味がありますか?

if(0 < 5 < 3) {
    alert("True");
}

これもそうです:

if(0 < 5 < 2) {
    alert("True");
}

しかし、これはしません:

if(0 < 5 < 1) {
    alert("True");
}

この癖は役に立ちますか?

4

14 に答える 14

446

操作の順序により、javascriptで(0 < 5 < 3)解釈され、true が 1 としてカウントされ、true が返されます。((0 < 5) < 3)(true < 3)

(0 < 5 < 1)これがfalse を返す理由でもあり、 (0 < 5)true を返します。これは と解釈され1、結果は になり(1 < 1)ます。

于 2010-11-03T16:34:58.743 に答える
63

私の推測では、0 < 5が true であり、どちらが truetrue < 3にキャストされる1 < 3かということです。

于 2010-11-03T16:34:48.447 に答える
21

おそらくそうtrue仮定されているから1

0 < 5 < 3  -->  true < 3 -->  1 < 3  --> true
于 2010-11-03T16:36:05.400 に答える
17

なぜならtrue < 3、なぜならtrue == 1

于 2010-11-03T16:35:13.040 に答える
10

この癖が役に立つかどうかというあなたの質問については、(凝縮されたコードが目的の場合) 役立つ場合があると思いますが、それに依存すると (ほとんどの場合) コードの理解度が大幅に低下します。

より大きな式の一部としてポスト/プリインクリメント/デクリメントを使用するようなものです。このコードの結果が一目でわかりますか?

int x = 5;
int result = ++x + x++ + --x;

注: このコードでは、言語とコンパイラによって異なる結果が得られる場合もあります。

あなた自身とあなたのコードを読む次の人のために人生を楽にするのは良い考えです. ブール値の暗黙的な変換などの副作用に頼るのではなく、実際に発生させたいことを明確に記述してください。

于 2010-11-03T20:31:21.793 に答える
9

質問の 2 番目の部分、「この癖は役に立ちますか?」に対する答えです。true が 1 にキャストされるのが実際に言語 (Javascript) の癖である場合、プログラマーは一般に 1 と true (および 0 と false) を同じこと。

しかし、1 が真で 0 が偽であるというメンタル モデルがある場合、非常に便利で、強力で、直接的なあらゆる種類の優れたブール演算手法につながります。たとえば、A > 100 の結果でカウンターを直接インクリメントすることができます。これは、A が 100 より大きい場合にカウンターをインクリメントします。この手法は、Java では癖またはトリックと見なされる場合がありますが、配列言語または関数型言語では見られます。慣用句かもしれません。

配列言語 APL の古典的な例は、配列内の (たとえば) 100 より大きい項目の数を数えることです。

+/A>100

A が 5 項目の配列 107 22 256 110 3 の場合:

A>100

5 項目のブール配列を生成します。

1 0 1 1 0

このブール値の結果を合計します。

+/1 0 1 1 0

最終的な答えが得られます:

3

この質問は、特に問題が一般化されて m 個のブール値のうち n 個が true であるかどうかを判断する場合に、この手法が非常に役立つことを示す完璧な例です。

3 つのブール値のうち少なくとも 2 つが true かどうかを確認します

于 2010-11-27T01:30:12.780 に答える
7

簡単だ。

(0 < 5 < 3)

左から右に開始して、最初の 0 < 5 を評価します。本当ですか? はい。TRUE=1 なので、1 < 3 と評価されます。1 は 3 より小さいので、真です。

これで

 (0 < 5 < 1)

0 は 5 未満ですか? はい。したがって、これも 1 を意味する TRUE にします。その事実を念頭に置いて、(1 < 1) と評価します。1 は 1 より小さいですか? いいえ、したがって、それは誤りです。等しくなければなりません。

于 2010-11-04T05:06:43.887 に答える
4

少し前に Obj-C でこれに遭遇し、非常に困惑しました。次のようなことを行うことで、必要な結果が得られました。

if(0 < 5  && 5 < 3) {
alert("True");}

もちろんこれは間違っているので、「本当の」アラートは表示されません。これを読んでよかった、今その理由がわかりました。

于 2010-11-03T20:01:56.813 に答える
4

1<3 が true の場合、true に対して 1 を返す 0<5 を評価していますか?

C# では、「演算子 '<' は型 'bool' および 'int' のオペランドには適用できません」

于 2010-11-03T16:39:17.807 に答える
4

Python に加えて、CoffeeScript は連鎖比較をサポートする別の言語であるため、vanilla JS3 < x < 10に変換されます。(3 < x && x < 10)

于 2012-10-29T16:01:23.273 に答える
3
0 < 5 < 3 
==> ( ( 0 < 5 ) < 3 )
==> true < 3
==> 1 < 3
==> true
于 2010-11-09T08:48:02.223 に答える
1

算術演算子を操作すると、ブール型オペランドは数値を返します。これを確認するために

true + 1  which gives you 2.

したがって0 < 5、返された boolean(true) は数学演算子 (<) で操作され、数値が返されます。したがって、それは 1<3 に沸騰します。true

于 2011-12-06T13:50:21.253 に答える
-1

結果を Number() として表現してみてください

if(Number(0) < Number(5) < Number(3)) {
    alert("True");
}

またはこれを試してください:

if(Number(0) < Number(5) && Number(5) < Number(3)) {
    alert("True");
}

私は取得していたのでこれをグーグルで検索しましたが、文字列形式で印刷されていた関数からこの値を取得していたため、 (3 >= 20) //returning truejavascript が3ブール値としてチェックしようとしていたと思います。elm.getAttribute();console.log();

于 2019-09-20T20:39:30.240 に答える