자바 스크립트 삼항 연산자 대 ||


17

나는 이전에 node.js 코드를 살펴 보았으며 그것을 작성한 사람이 다음 구문을 선호하는 것으로 나타났습니다.

var fn = function (param) {
    var paramWithDefault = null == param ? 'Default Value' : param;
}

내가 더 간결하다고 생각하는 것 :

var fn = function (param) {
    var paramWithDefault = param || 'Default Value';
}

두 번째 양식이 실제로 사회적으로 허용되는 JavaScript 구문인지 궁금합니다.이 목적을 위해 삼항 연산자보다 더 많은 시간을 보았습니다.

첫 번째 예제에서 그는 double equals (three triple equals가 아님)를 사용하고 있는데, 이는 "undefined"를 null로 계산하여 생각할 수있는 영향을 줄입니다. 그러나 ==는 JavaScript에서 다소 악의적 인 연산자라는 많은 곳에서 읽었습니다 (JSLint는 IIRC와 매우 반대입니다).


2
해설자 : 의견은 설명을 확대하기위한 것이지 확장 된 토론을위한 것이 아닙니다. 해결책이 있다면 답을 남기십시오. 솔루션이 이미 게시 된 경우 투표하십시오. 이 질문에 대해 다른 사람들과 논의하고 싶다면 chat을 사용하십시오 . 자세한 내용 은 FAQ 를 참조하십시오.

답변:


17

이 코드는 0, "", false 또는 다른 잘못된 값을 전달할 때마다 'Default Value'로 평가되므로

function fn(param) {
  var paramWithDefault = param || 'Default Value';
  return paramWithDefault;
}

이 특정 함수를 사용하는 방법을 물지 않을 수도 있지만 빈 문자열이나 0 또는 부울과 같은 것을 전달할 때 피하는 것은 나쁜 패턴입니다.


개체에는 null 병합 만 사용해야하며 개체가 정의되어 있으면 작동하지 않습니다. 빈 문자열을 제외하고 어쩌면.
Malfist

4
제로 비교는 좋은 지적이며, 예상치 못한 결과 일 수 있습니다.
Ed James

1
+1-이 문제는 정확하게 파이썬이 "x if y else z"구문을 추가 한 이유입니다. 논리 연산자에 대한 이러한 의미는 상당히 일반적이며, 관용구가 조건부 선택 연산자의 작업을 수행 할 때마다 동일한 공통 오류가 발생하는 경향이 있습니다.
Steve314

문자열 연결과 함께 사용하면 구문을 괄호 안에 넣는 것을 잊지 마십시오 var txt = 'Hello, ' + (user_name||'User') + '!';. 그러나 괄호가 없으면을 얻을 수 undefined있습니다. jsfiddle.net/4mFAB/1
c69

7

실제로 필요한 것은 null 통합 연산자입니다. 그러나 자바 스크립트에 실제로 하나가 없다는 것을 알면 프로그래머는 일반적으로 '||' 그것을 위해 서서.

그러나 둘 다 완벽하게 합리적입니다. 널 병합 연산자가 무엇인지 이해하지 못하는 사람들에게는 삼항 연산자가 이해 될 가능성이 높습니다.


다른 관련 연산자는 아이콘 연산자 철자 IIRC "else"입니다. 이는 첫 번째 인수의 특수 "실패"결과를 인식하고이 경우 두 번째 인수를 대안으로 사용합니다. 나는 파이썬 "x if y else z"가 두 개의 개별 연산자- "if"이진 어설 션 연산자와 아이콘 같은 "else"연산자를 사용하여 구현되기를 바랍니다.이 두 연산자는 독립적으로 사용할 수 있습니다. 그러나 Icon은 해당 스타일을 지원하지 않고 상대 연산자로 기괴한 작업을 수행했습니다.
Steve314

@ Steve314 : 파이썬에는 원하는 것이 있습니다 : [false-part, true-part]별도의 if 연산자 [..][bool(condition)]와 결합 된 별도 else 연산자 [false-part, true-part][bool(condition)]. 게으른 행동을 원한다면 간단히 참 부분과 거짓 부분을 람다 수 있습니다.
Lie Ryan

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.