쉼표를 사용한 할당이 작동합니까?


108

aaa = 1,2,3작동하고 값을 aaa로 설정 1합니까?

왜 작동하지 var bbb = 1,2,3않습니까?

var bbb = (1,2,3)작동하고 값을 bbb로 설정 3합니까?

콘솔 세션 예


9
변수 이름은 숫자로 시작할 수 없기 때문에 구문 오류가 발생합니다. var a1,a2,a3;단순히 세 개의 지역 변수를 선언합니다.
Jared Farrish 2014 년

답변:


200

여기에는 많은 일이 있지만 기본적으로 쉼표 연산자가 있습니다.

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


이 코드 :

aaa = 1,2,3

다음과 동일합니다.

aaa = 1;
2;
3;

따라서 aaa암시 적으로 선언되고 값 1이 할당됩니다. 콘솔의 출력은 마지막 명령문 3의 결과입니다.


이 코드 :

var bbb = 1,2,3

변수 선언의 쉼표는 한 줄에 여러 변수를 선언하는 데 사용되므로 구문 오류입니다. MDN 기사에서 지적했듯이

에서 쉼표주의 var문이 되지 는 식 내에 존재하지 않기 때문에, 쉼표 연산자. 오히려 var여러 개를 하나로 결합하는 것은 명령문 의 특수 문자입니다 .

따라서이 코드는 대략 다음과 같습니다.

var bbb = 1;
var 2;
var 3;

물론 2은 유효한 식별자가 아니므로 해당 지점에서 실패합니다.


이 코드 :

var bbb = (1,2,3)

숫자 값이 괄호로 묶여 있기 때문에 먼저 평가된다는 점을 제외하면 첫 번째 값과 매우 유사합니다. 따라서 이것은 다음과 거의 동일합니다.

1;
2;
var bbb = 3;

17
더욱의 =에서가 var bbb = 1;아니라 동일 =같이 aaa = 1;- 그들은 문법에 다른 작품에서 (AssignmentExpression 대 Initialiser를) 와서 그냥 같은 토큰을 사용하는 일이.
Ryan Cavanaugh 2014

7
아주 좋은 설명입니다. 완전히 명시 적이 지 않은 것은 다음 과 같이 평가되는 a = 1, 2, 3것으로 괄호로 묶을 수 있다는 (a = 1), 2, 3것입니다 a = 1; 2; 3(그리고 3을 반환합니다. 예를 들어 b = (a = 1, 2, 3)b에 3을 할당합니다). 반대로,로 a = (1, 2, 3)평가 1; 2; a = 3하고 3을 반환합니다.
CompuChip

MDN은 변수 할당의 괄호에 대해 무엇을 말하며 왜 역순입니까? 문서를 찾을 수 없습니다
Brian

@staticx 실제로 '반대로'수행되는 것은 없습니다. 괄호가 먼저 평가됩니다. 그냥 당신이있을 때처럼 (1 + 2) * 3의를 1 + 2먼저 평가하고, 그 표현의 결과는 평가의 나머지 부분에 대한 외부 표현으로 다시 대체됩니다.
pswg 2014

9

쉼표는 Javascript에서 여러 용도로 사용됩니다. 표현에서 :

a = 1, 2, 3;

단순히 오른쪽 인수를 반환하는 연산자입니다. 그러나 다음과 같은 var선언 구문의 일부이기도합니다 .

var var1 [ = val1 ], var2 [ = val2 ], var3 [ = val3 ], ...;

(여기서 [...]해당 부분은 선택 사항임을 의미). 귀하 var는 구문 분석하지 않도록 선언은 쉼표 후 변수 이름이 없습니다. 다음과 같이 원하는 효과를 얻을 수 있습니다.

var a = (1, 2, 3);

괄호는 쉼표가 변수 선언 사이의 구분 기호가 아닌 연산자로 처리되도록합니다.


7

귀하의 예에서 쉼표는 두 가지 컨텍스트에서 사용됩니다.

var 성명서

의 구문 var문은 다음과 같습니다

var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];

여기서 쉼표는 변수 이름-값 쌍을 구분하는 데 사용됩니다. 다음은 변수 이름이 숫자로 시작할 수 없기 때문에 작동하지 않습니다 ( 식별자 이름 참조 ).

var bbb = 1, 2, 3;
// SyntaxError: Unexpected number

쉼표 연산자

쉼표 연산자는 두 피연산자 (왼쪽에서 오른쪽으로)를 모두 평가하고 두 번째 피연산자의 값을 반환합니다. 다음 표현식은 다음과 같이 작동합니다.

aaa = 1, 2, 3;
  • aaa = 1, 2 2를 산출
    • 참고 aaa = 1평가가 먼저 때문에이 =보다 더 높은 우선 순위가,
  • 2, 3 3을 산출
var bbb = (1, 2, 3);
  • 식은 위에서 설명한대로 (1, 2, 3)산출 3됩니다.
  • 변수 bbb에 값이 할당됩니다.3

2
aaa = 1, 2, 3=> 쉼표 연산자는 aaa=1, 23. 쉼표 연산자의 결과는 마지막 문 3의 값입니다. 그러나 OP의 스크린 샷에서 명확하게 볼 수 있듯이 aaa에는 값 1이 할당됩니다. 그 이유는 쉼표 연산자의 우선 순위가 가장 낮은 연산자 우선 순위 때문입니다.
Tibos

1

첫 번째 경우 :

aaa = 1,2,3

쉼표는 표현식 구분 기호로 사용됩니다. 에 대한 할당을 수행 한 aaa다음 계산 2및 폐기 한 다음 계산 3및 폐기합니다.

두 번째 :

var bbb = 1,2,3

var키워드는 후 다음 일을하는 자바 스크립트 컴파일러에 알려줍니다 ,다른 변수 이름이어야합니다. 찾지 못해서 죽고 개그를칩니다.

var bbb = (1,2,3)

여기서 컴파일러는 먼저이를 평가 1하고 무시합니다. 그런 다음 평가 2하고 무시합니다. 그런 다음 평가 3하고 스택에 남아 있으므로bbb

쉼표를 사용하여 표현식을 구분하는 것은 일반적이지 않지만 for외모 와 같은 경우에 유용합니다 .

for (i = 0, l = 10; i < l; i++) {
  console.log(i);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.