[javascript] JavaScript OR (||) 변수 할당 설명

이 JavaScript 스 니펫을 감안할 때 …

var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';

var f = a || b || c || d || e;

alert(f); // 4

누군가이 기술이 무엇인지 설명해 줄 수 있습니까? (최상의 추측은이 질문의 제목입니다!) 어떻게 / 왜 정확히 작동합니까?

내 이해는 변수에 fnull 또는 undefined가 아닌 값을 가진 첫 번째 변수의 가장 가까운 값 (왼쪽에서 오른쪽으로)이 할당되지만이 기술에 대한 많은 참조 자료를 찾지 못했음을 알고 있습니다. 많이 사용하는 것을 보았습니다.

또한이 기술은 JavaScript에만 해당됩니까? PHP에서 비슷한 작업을 수행 f하면 d자체 값이 아닌 실제 부울 값 이 생성된다는 것을 알고 있습니다.



답변

설명은 단락 평가 를 참조하십시오 . 이러한 연산자를 구현하는 일반적인 방법입니다. JavaScript에 고유하지 않습니다.


답변

변수가 거짓 인 경우이 값을 기본값 으로 지정합니다 .yx

JavaScript의 부울 연산자는 피연산자를 반환 할 수 있으며 다른 언어와 같이 항상 부울 결과는 아닙니다.

논리 OR 연산자 ( ||)는 첫 번째 피연산자가 거짓이면 두 번째 피연산자의 값을 반환하고, 그렇지 않으면 첫 번째 피연산자의 값이 반환됩니다.

예를 들면 다음과 같습니다.

"foo" || "bar"; // returns "foo"
false || "bar"; // returns "bar"

Falsy 값에 그 누가 강제 변환됩니다 false부울 컨텍스트에서 사용할 때, 그들은이다 0, null, undefined, 빈 문자열, NaN물론을 false.


답변

Javacript는 논리 연산자 및에 대해 단락 평가 를 사용합니다 . 그러나, 또는 대신 실행을 중단 한 마지막 값의 결과를 반환한다는 점에서 다른 언어와 다릅니다 .||&&truefalse

다음 값은 JavaScript에서 허위로 간주됩니다.

  • 그릇된
  • 없는
  • "" (빈 문자열)
  • 0
  • 찾으시는 주소가 없습니다

연산자 우선 순위 규칙을 무시하고 간단하게 유지하기 위해 다음 예제는 평가를 중단 한 값을 보여주고 결과로 반환됩니다.

false || null || "" || 0 || NaN || "Hello" || undefined // "Hello"

처음 5 개의 값 NaN은 허위이므로 첫 번째 진실한 값을 충족 할 때까지 왼쪽에서 오른쪽으로 모두 평가됩니다 "Hello". 전체 표현식이 사실이되므로 더 높은 값은 평가되지 않고 "Hello"표현식의 결과로 반환됩니다. . 마찬가지로이 경우 :

1 && [] && {} && true && "World" && null && 2010 // null

처음 5 개의 값은 모두 진실이며 첫 번째 잘못된 값 ( null)을 충족 할 때까지 식을 거짓으로 만들어 2010더 이상 평가되지 않으며 null식의 결과로 반환됩니다.

당신이 주신 예제는 JavaScript의이 속성을 사용하여 할당을 수행하는 것입니다. 일련의 값 중 첫 번째 진실 또는 허위 가치를 얻는 데 필요한 모든 곳에서 사용할 수 있습니다. 이 코드는 아래의 값을 할당합니다 "Hello"으로 b대신하는 경우 – 다른 검사를하고, 그것은 더 쉽게 기본 값을 할당 할 수있다.

var a = false;
var b = a || "Hello";

아래 예제를이 기능의 악용이라고 부를 수 있으며 코드를 읽기가 더 어렵다고 생각합니다.

var messages = 0;
var newMessagesText = "You have " + messages + " messages.";
var noNewMessagesText = "Sorry, you have no new messages.";
alert((messages && newMessagesText) || noNewMessagesText);

경고 내에서 우리 messages는 거짓 인지 확인 하고, 그렇다면, 평가하고 반환하고 noNewMessagesText, 그렇지 않으면 평가하고 반환 newMessagesText합니다. 이 예제에서는 거짓이므로 noNewMessagesText에서 멈추고 경고 "Sorry, you have no new messages."합니다.


답변

Javascript 변수는 입력되지 않으므로 f는 부울 연산자를 통해 할당 된 경우에도 정수 값을 할당 할 수 있습니다.

f 에 false아닌 가장 가까운 값이 할당됩니다 . 따라서 0, false, null, undefined가 모두 전달됩니다.

alert(null || undefined || false || '' || 0 || 4 || 'bar'); // alerts '4'


답변

그것에 마법이 없습니다. 부울 식은 a || b || c || d느리게 평가됩니다. Interpeter는의 값을 찾고 a, 정의되지 않았으므로 false이므로 계속 진행 한 다음, b어느 것이 null인지, 여전히 잘못된 결과를 제공하여 계속 진행 한 다음 c동일한 이야기를 봅니다 . 마지막으로 d‘응, null이 아니기 때문에 결과가 있습니다’라고보고 최종 변수에 지정합니다.

이 트릭은 부울 식의 지연 단락 평가를 수행하는 모든 동적 언어에서 작동합니다. 정적 언어에서는 컴파일되지 않습니다 (유형 오류). 부울 표현식을 평가하고자하는 언어에서는 논리 값을 반환합니다 (이 경우 true).


답변

이 질문은 이미 몇 가지 좋은 답변을 받았습니다.

요약하면이 기술은 언어가 컴파일되는 방식의 기능을 활용하고 있습니다. 즉, JavaScript는 부울 연산자의 평가를 “단락”하여 첫 번째 거짓이 아닌 변수 값 또는 마지막 변수에 포함 된 값과 관련된 값을 반환합니다. 거짓으로 평가 될 값에 대한 Anurag의 설명을 참조하십시오.

이 기술을 사용하는 것은 여러 가지 이유로 좋은 습관이 아닙니다. 하나.

  1. 코드 가독성 : 부울 연산자를 사용하고 있으며이 컴파일 방식의 동작을 이해할 수없는 경우 예상 결과는 부울 값입니다.
  2. 안정성 : 여러 언어에서 일치하지 않는 언어가 컴파일되는 방식의 기능을 사용하고 있으며 이로 인해 향후 변경 될 가능성이 있습니다.
  3. 문서화 된 기능 :이 요구를 충족하고 더 많은 언어에서 일관된 기존 대안이 있습니다. 이것은 삼항 연산자입니다.

    ()? 값 1 : 값 2.

삼항 연산자를 사용하려면 조금 더 입력해야하지만 평가되는 부울 식과 할당되는 값을 명확하게 구분합니다. 또한 체인을 연결할 수 있으므로 위에서 수행 한 기본 할당 유형을 다시 만들 수 있습니다.

var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';

var f =  ( a ) ? a :
                ( b ) ? b :
                       ( c ) ? c :
                              ( d ) ? d :
                                      e;

alert(f); // 4


답변

출력 첫 번째 true 값을 반환 합니다 .

모두 거짓이면 마지막 거짓 값을 반환합니다.

예:-

  null || undefined || false || 0 || 'apple'  // Return apple