[javascript] JavaScript에는 “단락”평가가 있습니까?

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 && expr2followingly 실행된다 :

expr1로 변환 할 수 있으면 을 true반환합니다 expr2. 그렇지 않으면을 반환합니다 expr1.

따라서 실제 예에서는 const res다음과 같이 평가됩니다.

  1. 호출 expr1sanitise(0xFF)
  2. 0xFF 250에 유효한 16 진수입니다. 그렇지 않으면 반환합니다. NaN
  3. (가) expr1는 “truthy”값을 반환, 시간을 실행합니다 expr2 (달리 나는 멈출 줄 NaNfalsy입니다)
  4. 이후 userinputtruthy가 (숫자), 내가 추가 할 수 있습니다 +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

이제 다음과 같이 머리를 감 쌉니다.

  1. 우리는 &&연산자가 우선권을 가지고 있다고 말 했으므로 첫 번째로 평가됩니다. 평가를 더 잘 상상할 수 있도록 정의를 생각하십시오.

    expr1 && expr2

    어디:

    • expr2 이다 false
    • expr1 이다 true || false
  2. 그래서 그것은 까다로운 부분이었고, 이제 true || false평가됩니다 ( expr1-왼쪽 &&).

    • 지정된 ||경우 운전자하면 실행을 중지 expr1 || expr2expr1truthy로서 평가하여 상기가 expr1실행 코드의 실행이 중지된다.
  3. 반환 된 값은 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()
*/


답변