JavaScript에는 "단락"평가가 있습니까?


101

JavaScript에 C #의 && 연산자와 같은 "단락"평가가 있는지 알고 싶습니다. 그렇지 않은 경우 채택 할 수있는 해결 방법이 있는지 알고 싶습니다.


2
천만에요. https://www.google.com/search?q=site:stackoverflow.com+%s검색 속도를 높이기 위해 검색 바로 가기 (Chrome / Firefox)로 추가 했습니다.
Rob W

또한 여기에 내 질문에 대한 답변이 있습니다. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
GibboK

답변:


118

예, 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.
}

라이브 데모


8
그래서 단락이 JS의 표준입니까?
GibboK

1
감사합니다 gdoron, 이해하도록 도와주세요 ... C #에서는 &와 같은 이진 연산자도 있으므로 두 피연산자 모두 통과하려면 true 여야합니다. 대신 C에서 &&를 사용합니다
GibboK

1
@GibboK. 그럼 분명히 Short-circuit그 논리 연산자 에는있을 수 없습니다 . 직접 시도해보세요. 내 데모를 사용하십시오.
gdoron 모니카 지원하고

2
@GibboK :이 연산자 참조를 확인하십시오 . 그리고 예, JS에도 이진 AND 연산자가 있습니다.
Bergi

5
@GibboK. 표준에서 예! 그러나 자바 스크립트 구현에서 JIT- 컴파일-마법의 시대와 마찬가지로 어떤 것이 "표준"인지 또는 잠재적으로 구현 대상인지 알고 싶어하는 좋은 의견입니다. 이진 논리 연산자와 조건 문이 평가 방법 및 (짧은 curcuit)는 표준 행동이다 ecma-international.org/ecma-262/5.1/#sec-11.11
humanityANDpeace

24

이 답변은 빠른 정의를 찾고 있고 단락이 작동하는 방식을 이미 이해하고 있다면 다른 답변을 확인하는 것이 좋습니다. 모든 문제와 연산자 우선 순위와 같은 관련 주제와 함께 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. 호출 expr1-sanitise(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()  
*/


나는 1) "컴파일러"라는 단어를 사용하지 않을 것입니다. "엔진"이 더 정확합니다. 2)에 대해 이야기하지 expr1expr2 또는 condition1또는 무엇 이건, 그건 그냥 혼란. 하나를 결정하십시오. 예를 들어 지역 변수를 도입 할 수도 있습니다. const expr1 = true; if(expr1 && ...)
Jonas Wilms

@JonasWilms는 입력에 감사 드리며 그에 따라 답변을 수정했습니다.
Samuel Hulla

1
이것은 여전히 질문에 직접 답하지 않습니다.
Kevin B

7
이 최고입니다 "명시 적으로 질문에 대답하지 않는 좋은 대답은" 내가 지금까지 본 적이 있다는 ...
제라르 퍼 타도

1
이것은 깊은 설명과 함께 정답이며, 현재보다 훨씬 더 많이 수락되고 찬성되어야합니다!
Alexander Kim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.