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

자바 스크립트에서 테스트 할 여러 조건이있는 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 문을 중첩하는 것이 더 합리적입니다).

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



답변

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

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

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


답변

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

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

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

if (takesSeconds() && takesMinutes())

보다 훨씬 낫다

if (takesMinutes() && takesSeconds())

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


답변

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

var x = x || 2;

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


답변

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

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

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

예:

-2147483648 && 1 = 1 

그러나

-2147483648 & 1 = 0

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


답변

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

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


답변

단락 회로-귀하의 예에서는 a와 b 만 비교됩니다.


답변

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

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

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

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