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


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 1 및 Part 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.