ES6에서 'let'대 'const'를 얼마나 사용해야합니까?


214

최근에 io.js에 대한 많은 ES6 코드를 작성했습니다. 배울 수있는 코드가 많지 않기 때문에 갈 때마다 고유 한 규칙을 정의하고있는 것 같습니다.

내 질문은 언제 사용할 const것인지에 관한 것 let입니다.

이 규칙을 적용했습니다 const. 가능하면을 사용하십시오 . let값을 변경해야 할 경우 에만 사용 하십시오. ( 나중에 a const를 a로 변경 let하면 나중에 값을 변경해야하는 것으로 판명 될 수 있습니다.)

이 규칙의 주된 이유는 일관되게 적용하기 쉽기 때문입니다. 회색 영역이 없습니다.

문제는이 규칙을 적용 할 때 실제로 내 선언의 95 %가입니다 const. 그리고 이것은 나에게 이상하게 보입니다. 나는 루프 에서 let와 같은 것에 사용 하거나 때로는 축적 된 피보나치 총계 (실제에서는 많이 나오지 않음)에 사용하고 있습니다. 나는 이것에 놀랐다. 현재까지 ES5 코드에서 '변수'의 95 %는 변하지 않는 값에 대한 것이었다. 그러나 내 코드 전체를 보는 것은 어떻게 든 잘못 느낍니다.iforconst

그래서 내 질문은 : const이것을 많이 사용하는 것이 괜찮 습니까? 정말 같은 일을해야합니까 const foo = function () {...};?

또는 const모듈 상단에 리터럴을 하드 코딩하는 상황을 예약해야 const MARGIN_WIDTH = 410;합니까?


7
나는이 질문이 주로 의견에 근거한 것 같아서 닫힐 가능성이 있다고 생각하지만, 2 센트 : const이것을 많이 사용하는 것이 좋습니다.
jhominal April

15
function foo() {...}보다 낫습니다<anything> foo = function() {...}
OrangeDog

12
@OrangeDog 나는 정반대로 결론을 내렸으므로 이에 대한 설명을 듣고 싶습니다. function foo() {...}게양으로 인해 디버깅 할 때 약간의 혼란을 초래할 수 있는 경고가 있습니다. 또한 그것의 존재는 우리가 똑같은 일을하는 두 가지 구조를 가지고 있지만 그중 하나는 매우 구체적인 상황에서만 작동한다는 것을 의미합니다. (표현식이 존재할 수있는 곳이라면 어디에서나 함수 표현식을 사용할 수 있지만 명령문 수준에서만 함수 선언을 사용할 수 있습니다.) 간결성을 선호하는 경우 함수 표현식 구문이 전체 단어를 사용한다는 문제가있을 수 있습니다 function.
Keen

11
스택 트레이스는 anon 대신 함수 이름을 갖습니다. 호이 스팅은 양호하며 foo가 정의되지 않은 것에 대해 걱정할 필요없이 자연적인 순서로 함수를 정의합시다.
OrangeDog

1
이것들은 명심해야 할 좋은 점이지만 아직 확신하지 못했습니다. 최신 디버거는 사용자가 할당 한 심볼에 따라 함수에 적합한 표시 이름을 선택하는 데 효과적입니다 (없는 경우 명명 된 함수 표현식을 사용할 수 있음). 함수 선언의 자연스러운 순서는 매우 주관적입니다. 자연스러운 순서는 기본 조각을 정의하여 시작한 다음 나중에이를 사용하는 조각을 정의하는 것이라고 생각하는 것이 합리적 일 수 있습니다.
Keen

답변:


183

내 답변은 자바 스크립트별로 다릅니다.

반 쉬운 방법으로 그렇게 할 수있는 모든 언어의 경험에 따르면 항상 const / final / readonly / 언제든지 가능하면 항상 언어로 const / final / readonly /를 사용하십시오. 그 이유는 간단합니다. 변경 될 수있는 것과 변경 불가능한 것이 분명하지 않은 코드에 대해 추론하기가 훨씬 쉽습니다. 또한이 외에도 많은 언어에서 const로 선언 한 변수에 실수로 할당 할 때 잘못된 작업을 수행하고 있음을 알려주는 도구 지원을받을 수 있습니다.

되돌아 가서 const를 let으로 바꾸는 것은 간단합니다. 그리고 const를 기본으로 설정하면 그렇게하기 전에 두 번 생각하게됩니다. 그리고 이것은 많은 경우에 좋은 것입니다.

변수가 예기치 않게 변경되는 버그는 몇 개입니까? 많이 추측 할 것입니다. 내가 보는 대부분의 버그에는 예기치 않은 상태 변경이 포함되어 있음을 알고 있습니다. const를 자유롭게 사용하여 이러한 버그를 모두 제거하지는 않지만 많은 버그를 제거합니다!

또한 많은 기능 언어에는 기본적으로 모든 변수가 const 인 불변 변수가 있습니다. 예를 들어, Erlang 또는 F #을보십시오. 할당하지 않은 코딩은 이러한 언어에서 완벽하게 작동하며 사람들이 함수형 프로그래밍을 좋아하는 많은 이유 중 하나입니다. 더 나은 프로그래머가 되려면 상태 관리에 관해이 언어들로부터 배울 것이 많이 있습니다.

그리고 그것은 모두 const에서 매우 자유 로워지는 것으로 시작합니다! ;) let과 비교할 때 쓰는 문자가 두 개뿐이므로 계속 진행 const하십시오!


45
const보다 두 개 이상의 문자입니다 let...
OrangeDog

72
그러나 불변의 문자보다 5 문자가 적습니다.
Cerad

7
이것은 valScala (변수를 불변으로 선언)에서 사용하는 것과 비슷 하고 var우리가 사용할 수 없을 때만 ( 변동 가능한 동등 물)을 사용하는 것처럼 보입니다 val. 즉, 기본적으로 변수를 불변으로 선언하고 절대적으로 필요할 때만 변이를 도입합니다 (변동 가능한 접근 방식이 더 깨끗하기 때문일 수 있음).
Kat

7
나는이 답변에 동의하지만 일반 객체 또는 배열과 같은 작업을 할 때 'const'로 정의 된 경우에도 속성이 변경 될 수 있으므로 상황이 명확하지 않다는 것을 명심하십시오. 나는 'const'가 object.freeze처럼 작동한다고 생각했지만 실제로는 그렇지 않습니다.
backdesk

2
@Cerad "4 자 미만"을 의미 했습니까, 아니면 농담이 누락 되었습니까?
Mathias Bynens

57

const객체 키는 변경 가능 하므로주의하십시오 .

여기에서 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const

객체 키는 보호되지 않습니다

이 예제를 고려하십시오.

const colors = {red: "#f00"}; 
console.log(colors); // { "red": "#f00" }

colors.red = "#00f";
colors.green = "#0f0";
console.log(colors); // { "red": "#00f", "green": "#0f0" }

배열에 대해서도 마찬가지입니다.

const numbers = [1, 2, 3];
console.log(numbers); // [ 1, 2, 3 ]

numbers.push(4);
console.log(numbers); // [ 1, 2, 3, 4 ]

나는 완전히 스스로 결정하지는 않았지만 const모든 비 배열 / 비 객체에 사용 let하고 객체 / 배열에 사용 하는 것을 고려 하고 있습니다 .


34
사실이지만 예상되는 IMO-상수는에 지정된 객체 참조 const입니다. colors = numbers예상대로 작동하지 않습니다. 객체 속성을 보호하려면 Object.freeze() developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Josef Engelfrost

16
오해의 소지가 있습니다. 변경할 수 없습니다. 그러나 실제 객체 속성은 그렇지 않습니다.
Gaston Sanchez

1
+1 네, 참고 문헌은 보호되어 있지만 질문 측면 에서 const moment = require('moment')누군가가 moment = dead.fish(() => pizza)나중에 시도 할 것을 걱정하는 사람이 아닌 한 다음 과 같은 경우에는 사용하는 것이 매우 어리 석 습니다.
MaxWell

5
아마도 더 현실적으로 걱정할 것 moment = Date.now()입니다. 그러나 어쨌든 코드가 불변을 가정하면 가능한 한 코드를 시행하는 데 아무런 문제가 없습니다.
James M.

3
그러나 아무도 변하지 않았다고 말했다. const의 목표가 이름이 초기화 된 것과 다른 객체를 참조하지 않도록 보장 할 때 const의 목표를 불변으로 만드는 것이 일반적인 오해입니다.
monokrome

25

걱정하지 마십시오. constJavaScript에 대한 놀라운 추가 기능이므로 이해하기 쉬운 모든 장소에서 사용하는 것이 좋습니다. 보다 강력한 코드를 만듭니다.

객체와 관련 const하여 변수를 재할 당하지 못하도록 보호하지만 불변 객체가 필요한 경우 Object.freeze방법 이 필요합니다 ( 아래 참조).

const immutableOject = Object.freeze({immutableProperty: 'foo'});

const재 할당 만 보호하고이 freeze방법은 모든 즉각적인 속성을 보호합니다. 모든 중첩 속성도 변경할 수 없게하려면 재귀 적으로 사용해야 freeze합니다.


14
그 주 Object.freeze얕은입니다.
Mathias Bynens

@MathiasBynens 나는이 의견을 보았고 당신이 정확히 무엇을 의미하는지 궁금합니다. 좀 더 자세히 설명해 주시겠습니까?
Cole Roberts

@ColeRoberts 얕은 불변성의 개념은 객체 참조 자체가 불변이지만 속성을 여전히 변경할 수있는 경우입니다. const 키워드는 얕은 불변성을 만들기 때문에 모든 속성을 변경할 수없는 경우 Object.freeze를 사용해야합니다.
clean_coding

3
@ColeRoberts 고정 된 개체 (예 : 중첩 된 개체) 내의 개체 값을 여전히 변경할 수 있음을 의미합니다. 자세한 내용은 mathiasbynens.be/notes/es6-const#immutable-values 를 참조하십시오.
Mathias Bynens

19

ES6에서 const불변성 포스트 가 아니라const 스펙에 따라 정확히 무엇을 의미 하는지 설명합니다 .

이러한 객관적인 사실을 바탕으로 여기에 내가 개인적으로 선호하는 것이 있습니다.

[...]이 사용하는 말이 let하고 const당신의 ES6 코드에서 다음과 같이 :

  • const기본적으로 사용
  • let리 바인딩 (즉, 모든 형태의 재 할당)이 필요한 경우 에만 사용
  • ( varES6에서 사용해서는 안 됨)

주관적으로, 이것은 사양의 의도와 가장 일치하는 사실입니다.

let기본적으로 사용 하는 사람들은 일반적으로 const변수를 상수로 취급 합니다 (필수적으로 의도적으로는 아닙니다!). 나는 각자 자신의 의도에 따라 물건을 사용하는 것을 선호하지만 사람들이 오해를 바탕으로 그것을 할당하는 어떤 구성 적 의미로는 사용하지 않습니다.

사용 const상수 만은 사용처럼 하는 HTML <aside>요소 에만 사이드 바 콘텐츠를.


2
const상수가 아닌 이유는 무엇 입니까?
nu everest

3
@ nueverest 그것이 목적이 아니기 때문 const입니다. 위 내용을 읽었습니까?
Mathias Bynens

2
@MathiasBynens (단지?) 문제 const는이라고 불리는 것 const입니다. 처음에는 많은 (모두?) 개발자를 혼란스럽게하는 바보 같은 이름 (자바 스크립트)입니다. IMO constlet(특히 let더 짧지 만 const훨씬 더 일반적 이기 때문에 ) 호출되고 다른 것이라면 더 좋을 것 let입니다.
MrN00b

@MathiasBynens 나는 그것을 얻지 만 왜 그것을 그것을 부르는가? 이 페이지에서 보여 주듯이 엄청난 혼란을 겪고 있습니다.
jtr13

4

내 개인적인 접근 방식, 코드 가독성 및 이해를 돕기위한 생각 :


let단 한 줄로 정의되고 이후에 변경되지 않는 수명이 짧은 변수에만 해당됩니다. 일반적으로 입력량을 줄이기 위해 존재하는 변수. 예를 들면 다음과 같습니다.

for (let key in something) {
  /* we could use `something[key]` for this entire block,
     but it would be too much letters and not good for the
     fingers or the eyes, so we use a radically temporary variable
  */
  let value = something[key]
  ...
}

const전체 모듈에 걸쳐 일정한 것으로 알려진 모든 이름 . 로컬 상수 값을 포함하지 않습니다. value위의 예는, 예를 들어, 그 범위에서 일정하고 선언 할 수 const있지만, 많은 반복이 있고 각각에 대해이 같은과 값이기 때문에 이름 , "값"사고로, 그 독자를 속일 수 value항상 똑같다. 모듈과 함수는 const변수 의 가장 좋은 예입니다 .

const PouchDB = require('pouchdb')
const instantiateDB = function () {}
const codes = {
  23: 'atc',
  43: 'qwx',
  77: 'oxi'
}

var가변적이거나 변하지 않는 모든 것에 대해. 사람들이 지역적으로 일정하고 let(즉, 간단한 직접 선언으로 작성되지 않은) 코드를 읽는 사람들을 혼란스럽게 할 수있는 이름 은로 선언을 신청합니다 var. 예를 들면 다음과 같습니다.

var output = '\n'
lines.forEach(line => {
  output += '  '
  output += line.trim()
  output += '\n'
})
output += '\n---'

for (let parent in parents) {
  var definitions = {}
  definitions.name = getName(parent)
  definitions.config = {}
  definitions.parent = parent
}

추가 의견 및 가능한 향후 업데이트는 여기를 참조하십시오 .


10
두 번째 코드 스 니펫은 총처럼 보입니다.
Julian

1

JavaScript는 변수가 함수 등일 수 있다는 점에서 조금 특별하지만 C #, Java 또는 다른 유사한 C 스타일 언어를 고려하십시오.

const public void DoSomething()

(가) const홀수, 그들은 다른 뭔가로 컴파일하고 나면 다음 언어의 메소드 선언은, 변경할 수 없기 때문에 그건, 그건 그들이 (있을 수있는 몇 가지 끔찍한 해킹을 무시하고) 어떤 상관없이, 할 수없는 것입니다.

JavaScript가 다른 이유는 무엇입니까? 따라서 컴파일되지는 않지만 컴파일러가 제공 할 수있는 안전성을 버려야한다는 의미는 아닙니다. const키워드를 사용하면 더 많은 안전을 확보 할 수있어 더욱 강력한 응용 프로그램을 만들 수 있습니다.

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