자바 스크립트 변수 정의 : 쉼표와 세미콜론


88

세미콜론이 아닌 변수 그룹을 선언 할 때 쉼표를 사용할 때의 차이점 및 / 또는 이점은 무엇입니까?

예를 들면 :

var foo = 'bar', bar = 'foo';

var foo = 'bar';
var bar = 'foo';

var첫 번째 예제에서 첫 번째 변수에 키워드 를 지정하면 모든 변수에 걸쳐 지속되므로 둘 다 범위와 관련하여 동일한 최종 결과를 생성한다는 것을 알고 있습니다. 그것은 단지 개인적인 취향입니까, 아니면 어느 쪽이든 수행하면 성능상의 이점이 있습니까?

답변:


72

성능상의 이점은 없으며 개인적인 선택과 스타일의 문제입니다.

첫 번째 버전은 더 간결합니다.


최신 정보:

전송되는 데이터의 양에 관해서는 물론 적을수록 좋지만 var실제 영향을 확인하려면 엄청나게 많은 제거 된 선언 이 필요합니다 .

축소를가 로 첫 번째 예는, 그러나, 더 나은 축소를 위해 도움이됩니다 무언가로 언급 된 다니엘 Vassallo이 코멘트에 지적, 좋은의 minifier은 자동으로 당신을 위해 어쨌든, 그래서 그 점에 영향을주지 않고 무엇이든지 할 것입니다.


8
자바 스크립트를 축소하면 성능상의 이점이 있습니다.
Ryan Kinal

1
@Ryan Kinal-질문에서 정확히 어디에 축소가 언급되어 있습니까?
Oded

2
@Oded-최소화는 성능 문제와 일맥 상통합니다. 따라서 한 스타일이 더 나은 축소에 적합하다면 간접적으로 성능 문제에 적합합니다
STW

7
@Ryan : 구글 폐쇄 컴파일러와 같은 좋은 사용해 minifier는 하나에 여러 개의 VAR 문을 병합합니다 : img840.imageshack.us/img840/3601/closurecompilerservice.jpg
다니엘 Vassallo

2
그래 네가 맞아. 호기심으로 테스트 ( jsperf.com/… )를 만들고 5 번 실행하고 5 개의 다른 답을 얻었습니다. 그래서, 음, 예, 그것은 성능이 아니라 스타일과 개인적인 취향에 관한 것입니다.
Derek Henderson

29

Crockford와 다른 사람들을 읽은 후 쉼표로만 변수를 연결하기 시작했습니다. 그런 다음 나중에 쉼표로 변수 정의에서 멈추지 않는 Chrome DevTools 디버거에 정말 짜증이났습니다. 디버거의 경우 쉼표로 연결된 변수 정의는 단일 문이며 여러 var 문은 디버거가 중지 할 수있는 여러 문입니다. 따라서 다음에서 다시 전환했습니다.

var a = doSomethingA,
    b = doSomethignB,
    c = doSomethingC;

에:

var a = doSomethingA;
var b = doSomethignB;
var c = doSomethingC;

이제 디버거 문제를 해결하는 이점은 말할 것도없고 두 번째 변형이 훨씬 더 깔끔하다는 것을 알게되었습니다.

축소자가 있기 때문에 "전선을 통한 코드 감소"인수는 설득력이 없습니다.


1
나는 실제로 이것을 직접 경험했습니다. 나는 일반적으로 무언가를 확인해야하는 곳에서 선언을 분할하고 debugger거기에 드롭 한 다음 다른 var것을 추가 하고 계속 쉼표로 묶습니다. 그런 다음 디버깅이 끝나면 돌아가서 debugger및 추가 var.
Collin Klopfenstein 2014 년

7
두 번째 변형은 또한 git 히스토리를 더 깔끔하게 만듭니다. 다른 변수를 추가하거나 전역 변수를 생성하기 전에 후행 세미콜론을 쉼표로 변경하는 대신 전체 var 문을 추가하기 만하면됩니다.
payne8 2016 년

언급하자면 첫 번째 형식은 b 또는 c가 글로벌이라고 잘못 생각하게 만들 수 있습니다.
garg10may

18

나는 var-per-variable표기법을 선호합니다 .

var a = 2
var b = 3

다른 comma-instead-of-another-var표기법에는 다음과 같은 세 가지 단점이 있기 때문입니다 .

1. 유지하기 어렵다
다음 코드를 고려하십시오.

var a = 1,
    b = mogrify(2),
    c = 3

하지만 mogrify는 무엇을합니까? b를 인쇄하여 알아 봅시다 :

var a = 1,
    b = mogrify(2),
    console.log(b)
    c = 3

물건을 부수다

2. 읽기 어렵다

줄 구걸의 var는 새로운 변수가 시작될 것임을 명확하게 전달합니다.

var get_all_unicorn_promise = db.get_all_unicorns((unicorn) => {
        unicorn.legs.map((leg) => {
            leg.log('yes')
        })
    }).sort(),
    c = 3

도대체 c = 3거기서 뭐하는거야?

3. 일관성이 없음

이걸 고려하세요:

var a = 1,
    b = 2,
    c = 3

함께 var-per-variable모든 선언 동일한 구조를 따릅니다. 함께 comma-instead-of-another-var첫 번째 변수에 다른 사람보다 다른 방식으로 선언됩니다. 예를 들어, for 사이클 내에서 첫 번째 변수를 이동하기로 결정한 경우 선언 중간에 var를 추가해야합니다.

선호도 외에는 주목할만한 대부분의 프로젝트에서 var-per-variable표기법을 사용하는 것 같습니다.


이 추악한 스타일 (다른 var 대신 쉼표)의 예를 보려면 stackoverflow.com/questions/37332155/를
Scott Weaver

7

나는 이것이 주로 개인적인 스타일의 문제라는 다른 답변자들의 의견에 동의합니다. 그러나 토론에 "신뢰할 수있는"의견을 가져 오기 위해 Douglas Crockford 가 인기있는 JSLint 도구 웹 사이트에서 다음과 같이 말합니다 .

그러나 JavaScript에는 블록 범위가 없기 때문에 함수의 모든 변수를 함수 맨 위에 선언하는 것이 현명합니다. 함수 당 하나의 var 문을 사용하는 것이 좋습니다. 이는 onevar옵션 으로 시행 할 수 있습니다 .


6
Mozilla Javascript ( let구성을 통해 ) 에는 블록 범위 가 있다는 점은 주목할 가치 있습니다.
BlackVegetable 2013

3
@BlackVegetable let은 Mozilla JS 이상에서 사용할 수 있습니다 ( 여기 참조 ). 그것은이다 ES6 사양의 일부 있지만, 대부분의 브라우저는 여전히 ES6의 기능을 구현하기 위해 노력하고 있습니다.
mbomb007

3

다른 사람들이 언급했듯이 스타일 선호도입니다. JSLintvar 는 함수 당 하나만 갖도록 지시 할 수 있습니다 ( "Good Parts"를 사용하는 경우). 따라서 JSLint를 사용하여 코드를 확인하는 경우 (나쁜 생각이 아닙니다. IMHO) 후자보다 첫 번째 형식을 더 많이 사용하게됩니다.

반면에 동일한 저자 인 Douglas Crockford코딩 규칙 에서 각 변수를 고유 한 줄에 넣으라고 말합니다 . 따라서 varJSLint를 사용하는 경우 "All one per function"확인란 을 선택 취소 할 수 있습니다. ;-)


1
그가 맞아. 소스 제어 병합 알고리즘은 일반적으로 각 행을 한 행 내의 어휘 구문이 아닌 일반 텍스트로 비교하여 작동하므로 대부분의 언어에서 별도의 행에 변수를 배치하는 것이 좋습니다. 두 사람이 같은 함수를 편집하는 경우 같은 줄에 여러 변수를 선언하면 거의 확실하게 병합 충돌이 발생하는 반면 별도의 줄은 거의 항상 자동으로 병합 될 수 있습니다. (그들은 별도로 선언 된 관계없이 경우 var문이나 쉼표로 체인.)
리차드 딩월

2

나는 눈에 띄는 차이가 없다고 생각한다. 내가 염려하는 한 그것은 단지 개인적인 취향 때문이다.

여러 var 선언이 싫어서 일반적으로 다음을 수행합니다.

var 
   one
  ,two
  ,three
  ,four
;

더 짧고 더 읽기 쉬우므로 var볼 소음이 없습니다 .


22
"논란의 여지가있는"키워드. 이 샘플을 우리에게서 발견하면 var one, two, three four;매우 빨리 될 것 입니다. 라인 - 대한 - 더 - 사케의 라인 자바 스크립트를 추가하면 JS 통역이 자신을 삽입 할 수 있습니다 (위험 할 수 있습니다 ;당신이 다음 신속 부작용을 찾을 것으로 예상하지 않는다 굳이 이렇게. 또한, 선두 ,의 버그 나 키워드 자신의 라인 버그 저를 받고는 ;그 위에는 자신의 라인 버그에게 나야 당신에 의해 - 라인 지급됩니다.?
STW

8
@STW-개별 브라우저의 변덕에 따라 자동 세미콜론 삽입 소리를 무작위로 들리지만 실제로는 잘 정의 된 규칙 집합에 따라서 만 발생하며 다음에서 발생할 수 있다고 걱정할 필요가 없습니다. var선언 의 중간 . (나는 당신이 쉼표를 시작하고 var마지막 세미콜론이 자체 줄에 있다는 것에 동의하지만, 세 가지 모두 저도 버그입니다.)
nnnnnn

1
질문이 개인적 선호에 관한 것이 아니기 때문에 이것이 실제로 질문에 대한 답이라고 생각하지 않습니다.
Keith Pinson 2014 년

2

여기에 대한 참조가 없으므로 JavaScript의 기본 사양 인 ECMA-262 사양에 대한 링크가 있습니다. 해당 페이지의 문법은 다음과 같습니다.

12.2 Variable Statement

Syntax

  VariableStatement :
    var VariableDeclarationList ;

  VariableDeclarationList :
    VariableDeclaration
    VariableDeclarationList , VariableDeclaration

  VariableDeclarationListNoIn :
    VariableDeclarationNoIn
    VariableDeclarationListNoIn , VariableDeclarationNoIn

  VariableDeclaration :
    Identifier Initialiseropt

  VariableDeclarationNoIn :
    Identifier InitialiserNoInopt

  Initialiser :
    = AssignmentExpression
  InitialiserNoIn :
    = AssignmentExpressionNoIn

여기서 얻을 수있는 것은 쉼표를 사용하는 것입니까 아니면 중요하지 않습니다. 어느 쪽이든, 그것은 a로 파싱되고 VariableDeclaration정확히 동일하게 취급됩니다. 스크립트 엔진이 두 선언을 처리하는 방식에는 차이가 없어야합니다. 유일한 차이점은 다른 답변에서 이미 언급 한 것입니다. 더 많은 공간을 절약 VariableDeclarations하고 스크립트를 컴파일 할 때 모든 것을 찾기 위해 문법을 적용하는 데 걸리는 시간의 실질적으로 측정 할 수없는 차이입니다 .


1

첫 번째는 몇 개의 문자를 저장하므로 JS 파일 크기와 대역폭 소비 측면에서 매우 작게 절약됩니다. 이것이 눈에 띄는 유일한 시간은 극단적 인 경우입니다.


이것은 당신이 당신의 파일을 축소하지 않는다고 가정합니다. 그리고 요즘 누가 그들의 파일을 축소하지 않습니까?
Keith Pinson 2014 년

1

나는 두 번째 버전을 선호합니다 (각각 자체가 있습니다 var). 저는 C ++ 배경에서 왔기 때문이라고 생각합니다. C ++에서는 첫 번째 예제에서와 같이 변수를 선언 할 수 있지만 눈살을 찌푸립니다 (그런 식으로 포인터를 만들려고 할 때 쉽게 실수로 이어집니다).


1
흥미로운 점이지만, 이것이이 JavaScript 구문 의 실제 장점과 단점이 무엇인지에 대한 질문에 답할 수 있을지 모르겠습니다 .
Keith Pinson 2014 년

1

자바 스크립트를 축소하는 경우 상당히 큰 이점이 있습니다.

var one, two, three, four;

된다

var a, b, c, d;

어디로

var one;
var two;
var three;
var four;

된다

var a;
var b;
var c;
var d;

이는 var시간이 지남에 따라 추가 될 수 있는 추가 세 개의 인스턴스입니다 .

"A List Apart"기사 시리즈 "Better Javascript Minification" Part 1Part 2 참조


6
Google Closure Compiler와 같은 좋은 minifier는 여러 var 문을 하나로 병합합니다 : img840.imageshack.us/img840/3601/closurecompilerservice.jpg . 따라서이 인수 당신이 :) should't 덜 스마트 minifier을 ... 사용하는 경우에만 의미
다니엘 Vassallo

2
그리고 gzip을 사용하는 경우 반복되는 var s는 gzip 파일 크기를 눈에 띄게 증가시키지 않습니다 (gzipping을 올바르게 이해하는 경우).
Paul D. Waite 2012
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.