여러 조건이있는 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.