"기타"가없는 JavaScript의 3 진 연산자


149

나는 항상 null아무것도없는 조건 을 넣어야 했습니다. 어쨌든 주위에 있습니까? 예 :

condition ? x = true : null;

기본적으로 할 수있는 방법이 있습니까?

condition ? x = true;

이제 구문 오류로 표시됩니다

참고로 다음은 실제 예제 코드입니다.

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null;

21
삼항식의 사용 condition ? x = true : null;은 아마도로 작성해야합니다 x = (condition ? true : null);. 또한 자바 스크립트에서는 nullfalse로 평가 되므로이 경우 x = (condition);동일한 결과를 얻을 수 있습니다.
Matt S

1
매트, 당신의 대답은 최고이지만, 그것은 대답이 아닙니다, 그것은 주석입니다!
Cheeso

매트, 내 실제 코드는 다음과 같습니다!! defaults.slideshowWidth? defaults.slideshowWidth = obj.find ( 'img'). width () + 'px': null; 더 짧고 더 나은 방법은?
Oscar Godson

2
defaults.slideshowWidth = defaults.slideshowWidth || obj.find ( 'img'). width () + 'px';
kennebec

신원 할당을 피하는 것이 좋습니다. 따라서 이것은 조건 if (!defaults.slideshowWidth) defaults.slideshowWidth = obj.find('img').width()+'px'
일뿐입니다

답변:


226

우선, 삼항 표현식은 if / else 구문을 대체하지 않습니다 . 이는 값 을 리턴 하는 if / else 구문과 같습니다 . 즉, if / else 절은 코드이고 삼항 표현식은 expression 이므로 값을 리턴합니다.

이것은 여러 가지를 의미합니다.

  • 왼쪽에 =반환 값이 할당 될 변수가있는 경우에만 삼항식을 사용 하십시오.
  • 반환 된 값이 두 값 중 하나 일 경우 삼항 식만 사용하십시오 (또는 적합한 경우 중첩 식 사용).
  • 표현식의 각 부분 (? 및 이후 :)은 부작용없이 값을 리턴해야합니다 ( x = true모든 표현식이 마지막 값을 리턴 할 때 표현식 이 true를 리턴하지만 x가 리턴 된 값에 영향을주지 않고 x를 변경 함)

간단히 말해서 삼항식의 '올바른'사용은

var resultofexpression = conditionasboolean ? truepart: falsepart;

삼항식을 condition ? x=true : null ;사용하여의 값을 설정하는 예제 대신 다음을 사용할 x수 있습니다.

 condition && (x = true);

이것은 여전히 ​​표현식이므로 유효성 검사를 통과하지 못할 수 있으므로 더 나은 접근 방식은

 void(condition && x = true);

마지막은 유효성 검사를 통과합니다.

그러나 다시 예상 값이 부울 인 경우 조건식 자체의 결과 만 사용하십시오.

var x = (condition); // var x = (foo == "bar");

업데이트 샘플과 관련하여 아마도 더 적합 할 것입니다.

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

4
i/else문자가 충분하지 않으므로 오타 를 수정하도록 편집 할 수 없습니다.
dewed

1
무효 (조건 && X = TRUE) -이 보이는 큰하지만 던질 것 "잘못된 할당은 왼쪽 손을 측면"오류
유진 Tiurin에게

1
void (condition && (x = true)) // 과제를 첫 번째 값과 별도로 유지
diamondsea

4
그러나이 스타일에 익숙하지 않은 개발자에게는 특히 직관적이지 않습니다. 다음과 같이 쉽고 쉽게 읽을 수 있습니다. if (condition) {x = true; }
diamondsea

2
"검증을 통과하지 못할 수도있다"는 것이 무엇을 의미하는지 설명해 주시겠습니까? 왜에 표현을 포장해야하는지 이해할 수 없습니다 void(). 감사.
gilad mayani

20

아니요, 세 개의 피연산자가 필요합니다. 그래서 그들은 삼항 이라고합니다 연산자 입니다.

그러나 당신이 당신의 모범으로 가지고있는 것을 위해, 당신은 이것을 할 수 있습니다 :

if(condition) x = true;

앞으로 둘 이상의 명령문을 추가해야하는 경우 중괄호를 사용하는 것이 더 안전하지만

if(condition) { x = true; }

편집 : 이제 질문이 적용되는 실제 코드를 언급했습니다.

if(!defaults.slideshowWidth)
    { defaults.slideshowWidth = obj.find('img').width()+'px'; }

1
할 수는 있지만해서는 안됩니다. 주위에 중괄호가 없으면 이상하지 않습니다.
Konerak

1
그게 사실입니까? curls가 필요한 주된 이유는 jslint의 삶을 더 쉽게 만들기 때문입니다.
Cheeso

@Cheeso 리팩토링의 의미에서 오류가 발생하기 쉽습니다. 당신은 거기에 중괄호가 없다는 것을 깨닫지 않고 진정한 상태의 경우 더 많은 것을 추가하기 위해 돌아옵니다. 새 코드는 true 일 때가 아니라 항상 실행됩니다.
Matt S

아니, 나는 단순히? :;
Oscar Godson

3
솔직히 말해서 개발자가 Javascript : -PI보다 언어를 사용하는 것이 더 무섭다는 것을 결코 알지 못했습니다. 나는 그것들을 많이 생략하고 실수로 버팀대를 놓치는 것보다 더 이상 어려움을 겪지 않습니다.
Andy E

12

더 자주 사람들은 논리 구문을 사용하여 명령문 구문을 단축합니다.

!defaults.slideshowWidth &&
  (defaults.slideshowWidth = obj.find('img').width()+'px');

그러나 특별한 경우 구문이 더 간단 할 수 있습니다

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

이 코드 는가 true로 평가 defaults.slideshowWidth되면 값 을 반환하고 그렇지 않으면 값을 반환합니다.defaults.slideshowWidthobj.find('img').width()+'px'

자세한 내용 은 논리 연산자의 단락 평가 를 참조하십시오.


11
var x = condition || null;

2
(defaults.slideshowWidth) || (defaults.slideshowWidth = obj.find('img').width()+'px')또는defaults.slideshowWidth = defaults.slideshowWidth || (obj.find('img').width()+'px')
Casey Chu

> expr1이 true로 변환 될 수 있으면이를 리턴합니다. 그렇지 않으면 expr2를 반환합니다. 논리 연산자 (MDN)
Szabolcs Páll

5

당신은 쓸 수 있습니다

x = condition ? true : x;

따라서 조건이 거짓 일 때 x는 수정되지 않습니다.

이것은 다음과 같습니다

if (condition) x = true

편집하다:

!defaults.slideshowWidth 
      ? defaults.slideshowWidth = obj.find('img').width()+'px' 
      : null 

몇 가지 대안이 있습니다-나는 이것이 더 좋고 나쁘다는 것을 말하지 않습니다-단지 대안

기존 값이 널이므로 세 번째 매개 변수가 작동 할 때 널을 전달합니다. 조건을 리팩토링하고 변경하면 더 이상 사실이 아닐 위험이 있습니다. 삼항 경비원의 두 번째 선택으로 연장 가치를 전달 :

!defaults.slideshowWidth = 
      ? defaults.slideshowWidth = obj.find('img').width()+'px' 
      : defaults.slideshowwidth 

더 안전하지만,보기에는 좋지 않으며 타이핑이 더 많습니다. 실제로, 나는 아마 쓸 것입니다

defaults.slideshowWidth = defaults.slideshowWidth 
               || obj.find('img').width()+'px'

일부 라이브 코드는 (어쨌든 null을 제거합니까?) :! defaults.slideshowWidth? defaults.slideshowWidth = obj.find ( 'img'). width () + 'px': null;
Oscar Godson

2

귀하의 경우 삼항 연산자가 중복으로 간주됩니다. ||, && 연산자를 사용하여 변수를 표현식에 직접 지정할 수 있습니다.

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null ;

될 것입니다 :

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

더 명확합니다. 더 "자바 스크립트"스타일입니다.



1

배열이나 객체 선언 내부에 Ternary Operator를 사용하지 않으려면 ES6 spread operator를 사용할 수 있습니다 ...()

const cond = false;
const arr = [
  ...(cond ? ['a'] : []),
  'b',
];
    // ['b']

그리고 객체의 경우 :

const cond = false;
const obj = {
  ...(cond ? {a: 1} : {}),
  b: 2,
};
    // {b: 2}

원본 출처

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