2011-04-28 6 views

답변

7

그들은 비슷하지만 완전히 동일하지 않습니다. x ? x : yx을 선택한 경우 x을 두 번 평가합니다. x이 함수 호출이면 예기치 않은 결과가 발생할 수 있습니다.

ECMA specification에서 공식적인 증거를 찾을 수 있습니다.

또 다른 방법은 이것을 증명합니다 :

function a() { c++; return true; } 
function b() { d++; return true; } 
var c = 0, d = 0; 
a() || 3; 
b() ? b() : 3; 
/* c is 1; d is 2 */ 
-3

달성하고자하는 바에 달려 있습니다. 예를 들어 문자열을 다루는 경우 (x || y)은 "문자열 x가 null/empty가 아니면 OR 문자열 y가 null/empty가 아님"으로 변환 한 다음 1/true를 반환하고 (x ? x : y)은 "ifstring x가 null/empty가 아니고 그렇지 않으면 x를 반환합니다. (공백/null 인 경우) y "를 리턴합니다. 그래서 첫 번째 방법은 항상 부울 1/0 또는 참/거짓을 반환하지만 두 번째 방법은 2 개의 변수의 실제 값 중 하나를 반환합니다. 그렇다면 결과 (z)를 다른 if(z)에서 사용하려면 동등합니다.

+0

아니요, 잘못되었습니다. 'x || y'는 위증이 아니라면'x'를, 그렇지 않으면'y'를 반환합니다. –

2

ECMAScript language specification, 83 페이지 :

생산 LogicalORExpression : LogicalORExpression || LogicalANDExpression은 다음과 같이 평가됩니다.

  1. LogicalORExpressression을 평가 한 결과로 보자.
  2. lval을 GetValue (lref)로 설정합니다.
  3. ToBoolean (lval)이 true이면 lval을 반환합니다.
  4. LogicalANDExpression을 평가 한 결과를 rref라고 합니다.
  5. GetValue (rref)를 반환합니다.

그래서 || 결과는 부울 결과가 아니라 변수의 값을 반환합니다. 이 값은 if (...) 문에 의해 부울로 변환됩니다.

+0

같은 페이지에서 (? :) 연산자에 대한 설명을 찾고 어떻게 작동하는지 비교할 수 있습니다. –

1

그 두 표현은 자바 스크립트에서 동일이 "true"로 나 그렇지 않으면 두 번째 경우 논리적 "또는"연산자는 첫 번째 요소를 반환하기 때문에.

둘 다 ""0 자바 스크립트와 파이썬에 대한 거짓 예를 들어 어떤 값에 해당하는이 다른 동적으로 입력 된 언어 다르기 때문에 무엇을 대신 거짓으로 간주됩니다 ...주의해야하지만

하지만 []는 대한 거짓 자바에게는 사실이지만 파이썬. 대신 Common Lisp에서는 거짓으로 간주되는 NIL 만 제외하고 모든 것이 "true"( 0 또는 "" 또는 빈 배열 포함)로 간주됩니다 (NIL은 "빈 목록"이기도 함).이 그것이 존재하고, 그렇지 않으면 아무것도하지의 경우에만 redraw 메소드를 호출 obj.redraw && obj.redraw();과 같은 코드를 작성하는 예를 들어 허용하는

매우 유용한 (함수/메소드가 "참", undefined은 자바 스크립트가 "거짓"으로 간주된다는 것이다 Javascript의 경우). 대신 x 또는 y 당신이 다음 실제로 변수 만 표현을 의미하지 않는다

경우 "삼항 연산자"버전 x은 (첫 번째 평가를하는 경우 "true"를) 두 번 평가되기 때문에 두 사람은 해당되지 않습니다 한 번 "논리적 또는"버전. x이 함수 호출이면 차이가 있습니다.

자바 스크립트의 값을 부울 값으로 강제 설정하려는 경우 가장 일반적인 관용구는 !!x이며 항상 true 또는 false입니다.