(0 <5 <3)이 왜 true를 반환합니까?


348

나는 jsfiddle.net에서 놀고 있었고 이것이 왜 사실인지 궁금합니다.

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

이것도 마찬가지입니다 :

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

그러나 이것은하지 않습니다 :

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

이 특징은 유용합니까?


12
wtfjs.com 을 알고 있습니까 ?
Harmen

1
하아! 아니요 전에는 본 적이 없습니다.
punkrockbuddyholly

아, 암시 적 유형 변환의 기쁨.
Jörg W Mittag

4
유용한 적이 있습니까? 난독 화일 가능성이 있습니다. :-)
Icode4food

왜? 또한 필요한 상황 만 찾을 수 있다면 무엇이든 유용합니다. 사실, 이것은 다른 많은 것보다 덜 자주 요구되지만, 그들이 일을위한 도구가 될 수있는 시간, 수, 먼 시간이 있습니다.
temporary_user_name

답변:


440

오퍼레이션 순서는 (0 < 5 < 3)Javascript에서 ((0 < 5) < 3)생성되는 것으로 해석되며 (true < 3)true는 1로 계산되어 true를 리턴합니다.

이것은 또한 이유 (0 < 5 < 1)를 반환 거짓 (0 < 5)으로 해석됩니다 true를 반환 1결과 (1 < 1).


158
그리고 JavaScript는 파이썬이 아니기 때문입니다. :-)
rsenna 2016

1
를 추가하기 위해 질문을 편집하는 동안 응답했습니다 if(0 < 5 < 1) == false. 감사합니다 :)
punkrockbuddyholly 오전

28
정확히, 파이썬은 내가 알고있는 유일한 언어 ((0 < 5) && (5 < 3))입니다.
Alan Geleynse

18
@Alan : Mathematica가 또 다른 예입니다.
Joren

2
부울을 숫자와 비교하려고 할 때 IMHO JavaScript는 TypeError를 발생시켜야합니다.
Michał Perłakowski

63

내 생각 때문이다 0 < 5사실, 그리고 true < 3캐스팅을 얻을 수 1 < 3있는 사실이다.


7
여기에는 캐스팅이 없습니다. 캐스트는 프로그래머가 유형 을 명시 적으로 확인하는 데 사용하는 연산자 입니다. 이것은 부울에서 정수로의 암시 적 변환입니다.
erickson

4
@erickson, 정말로 ... 여기서 시맨틱 스에 매달릴 필요가 있습니까?
CaffGeek

2
에릭슨에 대해 걱정하지 마십시오. 시맨틱이라는 단어도 오용합니다. :)
Mateen Ulhaq

9
어쨌든 올바른 용어는 강제 입니다. 그리고 네, 에릭슨은 그것의 절대적인 확실성에 부분적으로 잘못되었습니다. 어떤 경우에도 강제 변환은 일반적으로 (그러나 단지 규칙 일뿐) "캐스트"라는 단어를 사용하여 명시 적 유형 변환을 표현하는 경우 일종의 캐스트입니다. 타입 변환 == 타입 캐스팅.
Jack

1
Sophists 모든 방법은 ... 어쨌든 대답은 '
비판적으로

21

아마도 그렇게 true추정되기 1때문에

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


10

이 기발한 것이 유용한 지 여부에 대한 귀하의 질문에 관해서는 : 유용한 코드가 유용 할 수있는 경우가 있다고 생각하지만 (응축 된 코드가 당신이 따르는 것이라면) 코드에 의존하면 코드의 이해도가 심각하게 줄어들 것입니다.

더 큰 표현식의 일부로 사후 / 사전 증가 / 감소를 사용하는 것과 비슷합니다. 이 코드의 결과를 한눈에 파악할 수 있습니까?

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

참고 :이 코드를 사용하면 언어 및 컴파일러에 따라 때로는 다른 결과를 얻을 수도 있습니다.

자신과 코드를 읽을 다음 사람위해 인생을 편하게 만드는 것이 좋습니다 . 부울의 암시 적 변환과 같은 부작용에 의존하기보다는 실제로 원하는 것을 명확하게 작성하십시오.


호기심이 result18 살 입니까?
punkrockbuddyholly

5
@MrMisterMan : Javascript에 대해서는 확신하지 못하지만 Java 및 C #에서는 평가가 왼쪽에서 오른쪽으로 보장되며 결과는 실제로 18입니다. C 및 C ++와 같은 일부 언어에서는 C / C ++과 같은 일부 언어에서는 보장되지 않습니다. 왼쪽에서 오른쪽으로 평가되며 컴파일러에서 추가 한 최적화에 따라 다른 결과가 나타날 수 있습니다.
Zach Johnson

9

질문의 두 번째 부분에 대한 대답은 "이 기발한 것이 유용합니까?" 이전 답변에서 언급했듯이 true가 실제로 1로 캐스팅되었지만 프로그래머가 일반적으로 1과 true (및 0과 false)가 아닌 언어 (자바 스크립트)의 기발한 경우 같은 것.

그러나 1이 참이고 0이 거짓 인 정신 모델을 가지고 있다면, 그것은 매우 유용하고 강력하며 직접적인 모든 종류의 멋진 부울 기술로 이어집니다. 예를 들어, A> 100의 결과로 카운터를 직접 증가시킬 수 있습니다. A가 100보다 크면 카운터가 증가합니다.이 기술은 Java에서는 엉뚱한 속임수 또는 배열 또는 기능적 언어로 볼 수 있습니다. 관용적 일 수 있습니다.

배열 언어 APL의 전형적인 예는 배열에서 100보다 큰 항목 수를 계산하는 것입니다.

+/A>100

여기서 A가 5 개의 항목 배열 인 경우 107 22256110 3

A>100

5 개의 항목 부울 배열을 생성합니다.

10010

이 부울 결과를 합하면 :

+/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 12

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 < 5math 연산자 (<)로 작동하는 반환 된 부울 (true)은 숫자를 반환합니다. 그래서 그것은 1 <3으로 끓입니다.true


1

0은 5보다 작기 때문에 true를 반환하고 기본적으로 true는 3을 포함하여 1을 평가할 수 있습니다.


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 truejavascript가 3부울 로 확인하려고 한 것 같습니다 .elm.getAttribute();console.log();

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.