(0 <5 <3)がtrueを返すのはなぜですか?


348

私はjsfiddle.netで遊んでいましたが、なぜこれがtrueに戻るのか知りたいです。

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

これもそうです:

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

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

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

この癖はこれまでに役に立ちましたか?


12
wtfjs.comを知ってますか?
Harmen

1
ハ!いいえ、今まで見たことがありません。
punkrockbuddyholly 2010年

ああ、暗黙の型変換の喜び。
イェルクWミッターク

4
役に立った?おそらく難読化のためです。:-)
Icode4food 2010年

どうして?また、それを必要とする状況のみを見つけることができる場合、何でも役立ちます。確かに、これは他の多くの場合よりも必要とされることはあまりありませんが、実際の仕事のためのツールである可能性はあるものの、場合によっては、その数が少ない場合もあります。
temporary_user_name

回答:


440

操作の順序により(0 < 5 < 3)、JavaScript ((0 < 5) < 3)で生成されるものとして解釈され(true < 3)、trueは1としてカウントされ、trueを返します。

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


158
そしてJavaScriptはPythonではないからです。:-)
rsenna

1
を追加するために質問を編集しているときに回答しましたif(0 < 5 < 1) == false。すべてが明確になりました、ありがとう:)
punkrockbuddyholly 2010年

28
正確には、Pythonがこの構文をとして扱うことがわかっている唯一の言語です。((0 < 5) && (5 < 3))おそらく他にもありますが、私はそれらを知りません。
Alan Geleynse、2010年

18
@Alan:Mathematicaは別の例です。
Joren

2
IMHO JavaScriptは、ブール値と数値を比較しようとするとTypeErrorを発生させるはずです。意味がないからです。
のMichałPerłakowski

63

私の推測は0 < 5trueであるためであり、trueにtrue < 3キャストさ1 < 3れます。


7
ここではキャストはありません。キャストは、プログラマーが型を明示的にチェックするため使用する演算子です。これは、ブール値から整数への暗黙の変換です。
エリクソン2010年

4
@エリクソン、本当に...ここでセマンティクスにこだわる必要はありますか?
CaffGeek 2010年

2
エリクソンを心配しないでください。私もセマンティックという言葉を誤用しています。:)
Mateen Ulhaq 2010年

9
いずれにせよ、正しい用語は強制です。そして、はい、エリクソンはその絶対的な確実性のために部分的に間違っています。型強制は、通常、キャストの一種です(ただし、これは単なる慣例です)、「キャスト」という単語を使用して明示的な型変換を表す場合も同様です。型変換==型キャスト。
Jack

1
ソフィストはずっと...返信はとにかく「
怠惰に

21

おそらくtrueとしている1ので、

0 < 5 < 3  -->  true < 3 -->  1 < 3  --> true


10

この癖が役立つかどうかについての質問について:便利な場合があるかもしれませんが(凝縮されたコードが目的の場合)、それに依存すると(おそらく)コードの理解しやすさが大幅に低下します。

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

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

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

あなた自身とあなたのコードを読む次の人のために人生を楽するのは良い考えです。ブール値の暗黙的な変換のような副作用に頼るのではなく、実際に何をしたいのかを明確に書き出してください。


好奇心から、result18歳ですか?
punkrockbuddyholly 2010年

5
@MrMisterMan:私はJavascriptについて確信がありませんが、JavaとC#では評価が左から右に保証され、結果は確かに18です。CやC ++などの一部の言語では、それが保証されることはありません左から右に評価され、コンパイラーによって追加された最適化によっては、結果が異なる場合があります。
ザックジョンソン

9

質問の2番目の部分への答えは、「この癖はこれまでに有用ですか?」前の回答で述べたように、trueが1にキャストされるのが確かに言語(Javascript)の癖であるが、プログラマーが一般的に1とtrue(および0とfalse)を同じこと。

ただし、1がtrueで0がfalseであるメンタルモデルがある場合、非常に便利で強力で直接的なあらゆる種類の優れたブールテクニックにつながります。たとえば、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

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

この質問は、特にmのブール値のうちnが真であるかどうかを決定するために問題が一般化されている場合に、この手法が非常に役立つ場所の完璧な例です。

3つのうち2つ以上のブール値がtrueかどうかを確認します


7

簡単だ。

(0 < 5 < 3)

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

これで

 (0 < 5 < 1)

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


4

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

C#でこれを実行させたい "演算子 '<'は、タイプ 'bool'および 'int'のオペランドには適用できません"


動的言語におけるC#の厳格さを見逃すことがあります。
Arman McHitarian 2013年

4

少し前にObj-Cでこれに遭遇し、非常に戸惑いました。私はこのようなことをすることによって私が望んだ結果を得ました:

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

もちろん、どちらが誤りであるので、その「本当の」警告を受け取らないでしょう。私はこれを読んでよかった、私は今、理由を知っています。


4

Pythonに加えて、CoffeeScriptは連鎖比較をサポートする別の言語であり、したがってバニラJSに3 < x < 10変換さ(3 < x && x < 10)れます



1

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

true + 1  which gives you 2.

その0 < 5ため、数学演算子(<)で操作された返されたブール値(true)は数値を返します。だから沸騰して1 <3に戻りますtrue


1

0が5未満の場合、それはtrueを返します。デフォルトでは、trueはすべてを含み、1に評価できます。1はまだ3未満であり、再びtrueを返します。


0

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

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

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

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

文字列形式で出力している関数からこの値を取得していたため、取得していて(3 >= 20) //returning true、javascriptが3ブール値としてチェックしようとしていたので、elm.getAttribute();これconsole.log();をググった。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.