JavaScript 표현식에서 쉼표는 무엇을합니까?


89

내가 사용하는 경우 :

1.09 * 1; // returns "1.09"

하지만 내가 사용한다면 :

1,09 * 1; // returns "9"

1,09가 숫자가 아니라는 것을 알고 있습니다.

마지막 코드에서 쉼표는 무엇을합니까?

더 많은 예

if (0,9) alert("ok"); // alert
if (9,0) alert("ok"); // don't alert

alert(1); alert(2); alert(3); // 3 alerts
alert(1), alert(2), alert(3); // 3 alerts too

alert("2",
    foo = function (param) {
        alert(param)
    },
    foo('1')
)
foo('3'); // alerts 1, 2 and 3

1
나는 9가 8 진수 리터럴에서 불법 '9'에 대해 실패하지 않는다는 것에 놀랐다.
재귀 적

7
@recursive-8 진수 표현의 9는 10 진수로 대체됩니다.
Yuval Adam

인수 목록에서 쉼표를 혼동하지 마십시오. alert하나의 인수 만 취합니다. 그 이후의 모든 것은 폐기됩니다.
Andrew

@Andrew : 예, alert ()에 의해 버려집니다. 하나의 인수 만 취하지 만 실행됩니다! 이상 하네. 감사.
Topera

1
@Topera : JS의 관점에서 생각해 보면 정말 이상하지 않습니다. JS에서는 함수 선언에 인수 목록을 지정할 필요가 없습니다 ( arguments대신 객체를 사용할 수 있으며 길이에 관계없이 가능). 현대적으로 컴파일 된 JS를 사용하더라도 함수가 얼마나 많은 인수를 취할지 미리 알 수있는 방법이 없습니다. 이것을 고려하십시오 : function test() { args=[]; for (var i = 0; i < arguments.length; i++) { args.push(arguments[i] + 1); } ;인터프리터는 얼마나 많은 인수가 필요한지 알기 위해 함수가 어떻게 사용되었는지 알아야합니다. 대신 모든 것을 평가합니다.
Andrew

답변:


95

쉼표 연산자는 두 피연산자 (왼쪽에서 오른쪽으로)를 모두 평가하고 두 번째 피연산자의 값을 반환합니다.

출처 : https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special_Operators/Comma_Operator

예를 들어 표현식은로 1,2,3,4,5평가됩니다 5. 분명히 쉼표 연산자는 부작용이있는 작업에만 유용합니다.

console.log(1,2,3,4,5);
console.log((1,2,3,4,5));


2
그들은 C에서 가져 왔습니다. 부작용이있는 표현에만 유용하다고 생각합니다.
Radomir Dopieralski

3
쉼표 연산자가 문자를 저장 (축소)하거나 코드를 난독 화하는 데 영향을 미치는 데 사용되는 많은 경우를 생각할 수 없습니다.
user17753 2013 년

1
@ user17753 for루프 의 세미콜론으로 구분 된 섹션에서 합법적으로 사용할 수 있습니다 .
Cyoce

1
@Cyoce : 사실이지만 일반적으로 이러한 논리는 루프 본문에서 더 명확하게 수행됩니다. 어떤 사람들은 자신의 방식이 continue중복없이 여러 포인트를 허용한다고 주장 하지만, 여러 포인트를 가져서는 안됩니다 continue.
궤도의 경쾌한 레이스

@ user17753 돈을 벌고 있습니다. 축소 된 코드의 작은 스 니펫을 이해하려고 애쓰는 것이 내가 여기있는 이유입니다
드물게 '모니카가있는 곳'

6

더 고려해야 할 사항 :

console.log((0, 9));
console.log((9, 0));
console.log(("foo", "bar"));


7
Lol, 재미 있습니다 :alert("1", alert("2", alert("3")))
Topera

1
@Andrew : 죄송합니다. 제가 사용하려는 내용으로 답변을 업데이트했습니다.
Douglas

쉼표 연산자는 각 피연산자를 평가하고 (왼쪽에서 오른쪽으로) last피연산자 의 값을 반환합니다 .
xgqfrms

2
쉼표 연산자는 두 피연산자 (왼쪽에서 오른쪽으로)를 모두 평가하고 피연산자의 값을 반환합니다 second .

https://stackoverflow.com/a/3561056/5934465

이럴거야!

쉼표 연산자는 각 피연산자를 평가하고 (왼쪽에서 오른쪽으로) last피연산자 의 값을 반환합니다 .

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator


5
쉼표 연산자는 두 개의 피연산자를 사용하므로 원래 따옴표가 정확했습니다. 당신이 말하는 것은 그러한 표현식을 중첩시킨 최종 결과이지만 대체 따옴표가 미묘하게 잘못되었음을 의미합니다. a,b,c,d입니다((((a),b),c),d)
궤도의 밝기 경주

1

보라 여기 - 쉼표는 여러 표현 / 문을 의미합니다. 예를 들어 코드에서 다음과 같은 줄을 사용할 수 있습니다.

var a=0, b=0, c=0;

이것은 작성하지 않고 세 변수를 모두 선언합니다.

var a=0;
var b=0;
var c=0;

도움이되기를 바랍니다.


23
약간 오래되었지만 유의해야 할 사항 : (1) 제공 한 예제는 쉼표 연산자를 사용하지 않습니다 ( var쉼표 경우에도 선언은 쉼표 연산자를 사용하지 않음 ) 및 (2) 분리 할 수 ​​없습니다. 쉼표 연산자를 사용하는 문장 표현식 만 허용됩니다.
콴타스 94 중량

0

객체에 속성을 추가 / 수정 하고 동일한 줄에 반환하는 것은 가능한 사용 사례입니다.

console.log(
  ((x) => (o = {biggerCond: r => r >= x},
           o.r5 = Array.from(window.crypto.getRandomValues(new Uint16Array(5))),
           o.isAnyBigger = o.r5.some(o.biggerCond),
           o.bigger = o.isAnyBigger ? o.r5.filter(o.biggerCond) : [x], o )
  )(5e4)
);
// Example
// {
//   bigger: [58414, 56500, 63397],
//   isAnyBigger: true,
//   isBiggerCond: r => r >= x,
//   r5: [58414, 12015, 56500, 63397, 43861]
// }

위의 익명 함수는 입력 값보다 큰 임의 값을 가진 객체를 반환하거나,없는 경우 bigger속성 에 포함 된 배열에 입력 값 자체를 포함 합니다.

그것은 여전히 ​​( 화살표 함수 와 같은) 구문상의 설탕 이지만 줄 수를 줄입니다 ... 일부 JS minifier가 유사한 방식으로 코드를 자동으로 감지하고 조정하는지 궁금합니다. 콘솔에서 실행하십시오.

((x)=>(o={biggerCond:r=>r>=x},o.r5=Array.from(window.crypto.getRandomValues(new Uint16Array(5))),o.isAnyBigger=o.r5.some(o.biggerCond),o.bigger=o.isAnyBigger?o.r5.filter(o.biggerCond):[x],o))(5e4)

2
하지만 물론 그런 비밀 주문을 프로덕션 코드에 넣지는 않겠죠?
궤도의 경쾌한 경주

@LightnessRacesinOrbit 글쎄, 나는 그것이 목적에 달려 있다고 말할 것입니다 (예 : 교육, 코드 단축, 변수 / 함수 선언 없음 등). 제가 위에서했던 것처럼 당신이 그것을 들여 쓰기를하면 완벽하게 읽을 수 ... 당신은 : "비밀"이라는 단어를 사용하는 것이 몰래 중지 할 수 있습니다
CPHPython

1
Heh, 그건 고의도 아니 었어요 😂
Lightness Races in Orbit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.