2014-03-31 3 views
4

Node.js를 콘솔을 사용하여 (노드 0.10.24)JavaScript에서 왜 (정의되지 않은 && true)는 정의되지 않은 값을 반환합니까?

> var x = (undefined && true); 
undefined 
> x; 
undefined 
> x = (true && undefined); 
undefined 
> x; 
undefined 

왜 비교가 정의되지 않은 반환하지? undefined가 "거짓"으로 간주되므로 false를 반환 할 것으로 기대합니다. 부울로 표현되는 값을 강요 내부적 의해

+0

관련 항목 : http://stackoverflow.com/q/22105549/497418 – zzzzBov

답변

7

&& 운영자 진행되지만, 조작자의 항상 실패 제 식 (즉, 그 falsey WAS)의 실제, uncoerced 값인 결과. true하지 falsey 때문에

따라서 (true && undefined)undefined 될 것이다. 마찬가지로 (true && 0)0으로 평가됩니다.

+3

결과는 실패한 _first_ 식의 비현실적 인 값입니다 (실행이 실패하자마자 중지하기 때문에). –

+1

@AaronDufour 아, 맞아. durr. 감사! – Pointy

4

자바 스크립트 ||&&은 부울 값을 반환하지 않을 수 있으며 피연산자가 부울 값일 때만 수행됩니다.

a = b ? b : c; 

a = b && c은 본질적에 대한 바로 가기입니다 :

a = b || c

는 바로 가기 본질적으로

a = b ? c : b; 
//or 
a = !b ? b : c; 
3

다른 사람들이 여기에 ECMAScript specification에 대해 말씀입니다, 무슨 말을 공식화하는 방법을 논리 AND 연산자 평가된다 :

  1. LogicalANDExpression을 평가 한 결과를 lref라고합시다.
  2. lval을 GetValue (lref)로 설정합니다.
  3. ToBoolean (lval)이 거짓이면 lval을 반환합니다.
  4. BitwiseORExpression을 계산 한 결과를 rref라고 합니다.
  5. GetValue (rref)를 반환합니다. 아마도

와 가장 관련성이 섹션 11.11 하단의 참고 사항 :

& & 나에 의해 생성 된 값을 || 연산자가 반드시 부울 유형 일 필요는 없습니다. 생성 된 값은 항상 두 개의 피연산자 표현식 중 하나의 값입니다.

부울 || 및 부울 && 사업자의 결과는 항상있을 것입니다 : 나는 단지의 경우 다른 사람의 뇌에서 여기 후손에 대한 내 대답을 내 같은 작품을 포함하고있어

+0

감사합니다. 내 시간을 "undefined"에 대한 문서를보고 낭비했다. AND 연산자가 아니다. – ThePizzle

0

다른 답변은 적절한 이상입니다 마지막 표현의 결과는 단락을 고려하여 평가됩니다.

따라서 ||의 경우 첫 번째 표현식이 truthy 인 경우 단락 회로 평가는 나머지는 무시되고 결과는 첫 번째 표현식의 값이됨을 의미합니다. falsy 인 경우 평가는 두 번째 표현식으로 계속되어야하며 결과는 사실인지 거짓인지에 관계없이 두 번째 표현식의 결과가됩니다. 제 식이면

마찬가지로 && 들어 falsy 다음 평가를 중지하고 truthy 후 평가가 계속있어, 그 결과가 두 번째 식의 결과가있는 경우 결과가 그 제 발현의 결과이다.

관련 문제