여러 조건이있는 javascript if 문이 모든 조건을 테스트합니까?


100

자바 스크립트에서 테스트 할 여러 조건이있는 if 문을 사용할 때 자바 스크립트는 모든 조건을 테스트합니까, 아니면 이미 거짓이면 모두 테스트하기 전에 보석금을 낼까요?

예를 들면 :

 a = 1
 b = 2
 c = 1

 if (a==1 && b==1 && c==1)

자바 스크립트는 이러한 3 가지 조건 모두에 대해 테스트할까요? 아니면 b가 1과 같지 않아 거짓임을 확인한 후 문을 종료합니까?

성능의 관점에서 묻습니다. 예를 들어, 3 개의 복잡한 jQuery 선택기를 테스트하는 경우 첫 번째를 통해 FALSE를 반환 할 것이 분명하다면 jQuery가 DOM을 3 번 통과하지 않는 것이 좋습니다. (이 경우 3 개의 if 문을 중첩하는 것이 더 합리적입니다).

부록 : 더 많은 호기심, 이것에 대한 적절한 용어는 무엇입니까? 나는 많은 사람들이 '단락'이라는 용어를 사용한다는 것을 알고 있습니다. 또한 일부 언어는 이것을 수행하고 다른 언어는 수행하지 않습니까?


@Josh : 이것이 마이크로 최적화라는 생각에 완전히 감사드립니다. 알아두면 좋습니다. 즉, 하나의 옵션이 다른 옵션보다 더 최적화 된 경우 해당 방법을 알고 습관화하는 것이 좋습니다. (게다가 답에 대해서도 정말 궁금했습니다)
— DA.

21
엄밀히 말하면 이것은 조기 최적화가 아닙니다. 단락 논리를 사용하는 언어에서는 어떤 조건에서 일부 메서드가 실행되지 않는지 아는 것이 중요합니다. 예를 들어 부작용에 의존하고 있다면.
— Rob

5
다음은 "단락 평가"에 대한 또 다른 질문입니다. stackoverflow.com/questions/1232603/…
— David

@David. 감사! 흥미로운 독서.
— DA.

답변:


151

&&운영자 "단락"- 왼쪽 조건이 거짓 인 경우이며, 그것은 올바른 평가를 귀찮게하지 않습니다.

마찬가지로 ||왼쪽 조건이 참이면 연산자가 단락됩니다.

편집 :하지만 벤치마킹하고 문제가 있음을 결정할 때까지 성능에 대해 걱정해서는 안됩니다. 조기 마이크로 최적화는 유지 관리의 골칫거리입니다.


1
우수 답변 (기술적 인 부분과 관리 문제 모두). 감사!
— DA.

5
부울 구문의 모든 부분을 실행하고 싶다면 & 및 | 및 또는 각각
— Zoidberg

25
이 조건은 항상 성능에 관한 것은 아닙니다. 때로는 null 검사를 수행하고 null 검사가 조건 a인지 말한 다음 두 번째 검사에 대해 (b == value + 1)을 시도하면 조건이 모두 확인되면 세 가지 조건이 모두 오류가 발생합니다.
— infocyde 2009

4
실제로 단락은 성능에 관한 것이 아닙니다. 그러나 원래 질문은 성능 관점에서 묻는 것이었다.
— 아논.

1
아주 좋아. 이러한 종류의 마이크로 최적화 (특히)를 수행하면 스크롤 이벤트 루프 내부에 큰 영향을 미칠 수 있습니다. 예를 들어 여러 요소의 시차 계산 (예 : 고정 막대)을 예로들 수 있습니다. 예를 if (!barSticky && bar.parent().offset().top <= document.documentElement.scrollTop)들면 두 번째 조건은 더 많은 비용이 드는 계산이고 첫 번째 조건은 부울입니다. :)
— antoni 2010 년

13

성능 측면에서 이것은 마이크로 최적화가 아닙니다.

3 개의 부울 변수 a, b, c가 있으면 마이크로 최적화입니다.

부울 변수를 반환하는 3 개의 함수를 호출하면 각 함수에 시간이 오래 걸릴 수 있으며이 단락을 아는 것이 중요 할뿐만 아니라 순서도 중요합니다. 예를 들면 :

if (takesSeconds() && takesMinutes())

보다 훨씬 낫다

if (takesMinutes() && takesSeconds())

둘 다 똑같이 false를 반환 할 가능성이 있습니다.


12

그래서 다음과 같은 자바 스크립트 코드로 할 수 있습니다.

var x = x || 2;

즉, x가 정의되지 않았거나 '거짓'이면 기본값은 2입니다.


3
JS가 단락 평가를 지원하지 않더라도 작동 할 수 있습니다.
— pswg 2014

1
이것은 삼항과 동일합니까?
— Mark Carpenter Jr.

10

누군가 가 모든 조건 의 평가 를 강제 하는 방법이 있는지 궁금한 경우 , 경우에 따라 비트 연산자 &를 |사용할 수 있습니다.

var testOr = true | alert(""); //alert pops up
var testAnd = false & alert(""); //alert pops up

이 사용해야 정말 신중하게 비트 연산자가 피연산자의 단일 비트에서 작동하며 산술 연산자이기 때문에 할 수 항상의 "비 단락"버전과 같은 기능 &&과||

예:

-2147483648 && 1 = 1 

그러나

-2147483648 & 1 = 0

여기에 도착한 누군가가 (나와 같은) 정보를 찾는 데 도움이 되었기를 바라며 수정 및 반례에 대해 @Max에게 감사드립니다.


1
이 대답은 틀 렸습니다. & 및 | 비트 연산자이며 '&& 및 ||'의 비 단락 버전이 아닙니다. 비트 연산자는 피연산자의 단일 비트에서 작동하는 산술 연산자입니다. 예 : -2147483648 && 1 = 1 but -2147483648 & 1 = 0. 자세한 정보 : en.wikipedia.org/wiki/Bitwise_operation
— Max

1
@Max는 실제로 이것을 몰랐습니다. 저는 C를 공부 한 이후로 이것을 사용하고 있습니다. 운 좋게도 내 코드를 깨뜨릴 수있는 입력은 결코 나오지 않았습니다. 내 대답을 수정, 난 당신이 빚
— ivcandela

@DJDaveMark 미안은 얻을 수 없었다 false && (alert(""))작업에 솔루션을 : /
— ivcandela

@ivcandela 나도 그럴 수 없었다. 만약 내가 내 전화를 사용하지 않았다면 나는 그것을 1st 테스트했을 것이다. o) 안타깝게도 댓글을 편집 할 수 없다. 난 그냥 삭제 아래에 또 다른 추가
— DJDaveMark

평가를 강제하는 더 간단하고 더 좋은 방법은 결과를 변수에 저장 한 다음 변수에 대해 테스트하는 것입니다.var a=false; var b=check(); alert(a && b);
— DJDaveMark

7

첫 번째 조건이 참인 경우에만 모든 조건을 테스트하고 직접 테스트합니다.

javascript: alert (false && alert("A") && false);


3

왼쪽에 하나 이상의 매개 변수를 사용하여 평가를 중지하는 또 다른 이유입니다.

if (response.authResponse && (response.authResponse.accessToken! = user.accessToken)) {...}

두 번째 평가는 첫 번째가 참인 것에 의존하며, 첫 번째 조건이 실패했기 때문에 response.authResponse가 null이거나 정의되지 않은 경우 등으로 컴파일 오류가 발생하지 않습니다.

다른 언어는 초기에이 문제가 있었으며 지금은 컴파일러를 빌드하는 표준 접근 방식이라고 생각합니다.


2

b가 1과 같지 않음을 확인한 후 종료됩니다.


2

이 질문에 대해 혼란스러워하는 사람은 다음 ||과 같이 ?연산자 와 함께 사용할 때 단락 동작을 보지 못하기 때문입니다 .

x = 1 || true ? 2 : 3 // value of x will be 2, rather than 1 as expected

단락 규칙이 작동하지 않는 것 같습니다. ||첫 번째가 참일 때 왜 (참? 2 : 3) 의 두 번째 항을 평가 하는가? 위의 내용은 다음과 같기 때문에 작업 순서 문제로 판명되었습니다.

x = (1 || true) ? 2 : 3

와 ||제 평가는 상기 ?제 평가 하였다. 원하는 것은 다음과 같습니다.

x = 1 || (true ? 2 : 3)

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