JavaScript에서는 모든 종류의 변수 (예 : 문자열, 함수 등)에 대해 항상 조건부 연산자 대신 부울 OR을 사용할 수 있습니까?JavaScript : 조건부 (3 진) 대 부울 OR 또는 부울이 아닌 값?
예를 들어, z = (x ? x : y)
대신 z = (x || y)
입니다.
JavaScript에서는 모든 종류의 변수 (예 : 문자열, 함수 등)에 대해 항상 조건부 연산자 대신 부울 OR을 사용할 수 있습니까?JavaScript : 조건부 (3 진) 대 부울 OR 또는 부울이 아닌 값?
예를 들어, z = (x ? x : y)
대신 z = (x || y)
입니다.
그들은 비슷하지만 완전히 동일하지 않습니다. x ? x : y
은 x
을 선택한 경우 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 */
달성하고자하는 바에 달려 있습니다. 예를 들어 문자열을 다루는 경우 (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)
에서 사용하려면 동등합니다.
ECMAScript language specification, 83 페이지 :
생산 LogicalORExpression : LogicalORExpression || LogicalANDExpression은 다음과 같이 평가됩니다.
- LogicalORExpressression을 평가 한 결과로 보자.
- lval을 GetValue (lref)로 설정합니다.
- ToBoolean (lval)이 true이면 lval을 반환합니다.
- LogicalANDExpression을 평가 한 결과를 rref라고 합니다.
- GetValue (rref)를 반환합니다.
그래서 || 결과는 부울 결과가 아니라 변수의 값을 반환합니다. 이 값은 if (...)
문에 의해 부울로 변환됩니다.
같은 페이지에서 (? :) 연산자에 대한 설명을 찾고 어떻게 작동하는지 비교할 수 있습니다. –
그 두 표현은 자바 스크립트에서 동일이 "true"로 나 그렇지 않으면 두 번째 경우 논리적 "또는"연산자는 첫 번째 요소를 반환하기 때문에.
둘 다 ""
및 0
자바 스크립트와 파이썬에 대한 거짓 예를 들어 어떤 값에 해당하는이 다른 동적으로 입력 된 언어 다르기 때문에 무엇을 대신 거짓으로 간주됩니다 ...주의해야하지만
[]
는 대한 거짓 자바에게는 사실이지만 파이썬. 대신 Common Lisp에서는 거짓으로 간주되는 NIL 만 제외하고 모든 것이 "true"(
0
또는
""
또는 빈 배열 포함)로 간주됩니다 (NIL은 "빈 목록"이기도 함).이 그것이 존재하고, 그렇지 않으면 아무것도하지의 경우에만
redraw
메소드를 호출
obj.redraw && obj.redraw();
과 같은 코드를 작성하는 예를 들어 허용하는
매우 유용한 (함수/메소드가 "참", undefined
은 자바 스크립트가 "거짓"으로 간주된다는 것이다 Javascript의 경우). 대신 x
또는 y
당신이 다음 실제로 변수 만 표현을 의미하지 않는다
경우 "삼항 연산자"버전 x
은 (첫 번째 평가를하는 경우 "true"를) 두 번 평가되기 때문에 두 사람은 해당되지 않습니다 한 번 "논리적 또는"버전. x
이 함수 호출이면 차이가 있습니다.
자바 스크립트의 값을 부울 값으로 강제 설정하려는 경우 가장 일반적인 관용구는 !!x
이며 항상 true
또는 false
입니다.
아니요, 잘못되었습니다. 'x || y'는 위증이 아니라면'x'를, 그렇지 않으면'y'를 반환합니다. –