JavaScript에 C #의 && 연산자와 같은 “단락”평가가 있는지 알고 싶습니다. 그렇지 않은 경우 채택 할 수있는 해결 방법이 있는지 알고 싶습니다.
답변
예, JavaScript에는 “단락”평가가 있습니다.
if (true == true || foo.foo){
// Passes, no errors because foo isn't defined.
}
if (false && foo.foo){
// Passes, no errors because foo isn't defined.
}
답변
이 답변은 단락빠른 정의를 찾고 있고 단락이 작동하는 방식을 이미 이해하고 있다면 다른 답변을 확인하는 것이 좋습니다. 모든 문제와 연산자 우선 순위와 같은 관련 주제와 함께 JavaScript에서 작동합니다.
우리가 지금까지 알고있는 것 :
먼저 두 가지가 있는지 확인하는 데 if()
사용 하는 블록 내부에서 우리 모두에게 익숙한 동작을 살펴 보겠습니다 .&&
true
if (true && true) {
console.log('bar');
}
: 지금, 당신의 첫번째 본능 말을 아마 ‘아 그래, 아주 간단한 코드는 두 경우 문을 실행 expr1
하고 expr2
로 평가됩니다 true
‘
글쎄, 예 그리고 아니오. 당신은 기술적으로 정확합니다. 그것은 당신이 기술 한 행동입니다. 그러나 그것은 정확히 코드가 평가되는 방식이 아니며 우리는 완전히 이해하기 위해 더 깊이 탐구해야 할 것입니다.
&&
과 는 정확히 어떻게 ||
해석 됩니까 ? :
“의 후드 아래에서 볼 시간입니다 자바 스크립트 이 실용적인 예를 고려해 보겠습니다.
function sanitise(x) {
if (isNaN(x)) {
return NaN;
}
return x;
}
let userinput = 0xFF; // as an example
const res = sanitise(userinput) && userinput + 5
console.log(res);
결과는 260
.. 인데 왜? 답을 얻으려면 단락 평가가 어떻게 작동하는지 이해해야합니다.
바이 MDN 정의
&&
연산자는expr1 && expr2
followingly 실행된다 :
expr1
로 변환 할 수 있으면 을true
반환합니다expr2
. 그렇지 않으면을 반환합니다expr1
.
따라서 실제 예에서는 const res
다음과 같이 평가됩니다.
- 호출
expr1
–sanitise(0xFF)
0xFF
250에 유효한 16 진수입니다. 그렇지 않으면 반환합니다.NaN
- (가)
expr1
는 “truthy”값을 반환, 시간을 실행합니다expr2
(달리 나는 멈출 줄NaN
falsy입니다) - 이후
userinput
truthy가 (숫자), 내가 추가 할 수 있습니다+5
여기에
그래서 여기서 우리는 운영자 의 간단한 사용법으로 추가 if
블록과 추가 isNaN
검사 를 피할 수있었습니다 &&
.
작동 원리 :
지금 쯤이면 우리는 적어도 단락운영자가 작동합니다. 보편적 인 규칙은 다음과 같습니다.
(some falsy expression) && expr
허위 표현으로 평가됩니다(some truthy expression) || expr
진실한 표현으로 평가됩니다
다음은 더 나은 이해를위한 몇 가지 추가 예입니다.
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() && b() ){
console.log('foobar');
}
//Evaluates a() as false, stops execution.
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() || b() ){
console.log('foobar');
}
/* 1. Evaluates a() as false
2. So it should execute expr2, which is `b()`
3. b() returned as true, executing statement `console.log('foobar');`
*/
마지막으로 성가 시지만 매우 중요한 사항 [Operator Precedence] :
멋져요, 잘 만하면 당신이 그것을 이해하고 있습니다! 마지막으로 알아야 할 것은 연산자 우선 순위에 대한 규칙입니다.
&&
운영자는 항상 이전에 실행||
연산자.
다음 예를 고려하십시오.
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log(a() || b() && c());
// returns a() and stops execution
이것은 아마도 a()
. 이유는 매우 간단합니다. 우리는 왼쪽에서 오른쪽으로 읽는 데 익숙하기 때문에 우리를 속이는 것은 단지 우리의 시력입니다. console.log()
평가에만 집중 해 보겠습니다.
true || false && false
이제 다음과 같이 머리를 감 쌉니다.
-
우리는
&&
연산자가 우선권을 가지고 있다고 말 했으므로 첫 번째로 평가됩니다. 평가를 더 잘 상상할 수 있도록 정의를 생각하십시오.expr1 && expr2
어디:
expr2
이다false
expr1
이다true || false
-
그래서 그것은 까다로운 부분이었고, 이제
true || false
평가됩니다 (expr1
-왼쪽&&
).- 지정된
||
경우 운전자하면 실행을 중지expr1 || expr2
에expr1
truthy로서 평가하여 상기가expr1
실행 코드의 실행이 중지된다.
- 지정된
-
반환 된 값은
true
음 .. 그건 꽤나 까다로 웠습니다. 이상한 규칙과 의미론이 거의 없기 때문입니다. 하지만 당신은 항상 함께 연산자 우선 순위를 탈출 할 수 기억 ()
– 단지 수학처럼
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log((a() || b()) && c());
/* 1. The () escape && operator precedence
2. a() is evaluated as false, so expr2 (c()) to be executed
3. c()
*/