Frontend πŸ“š/JavaScript

[JS] μ‹λ³„μž, ν˜Έμ΄μŠ€νŒ…, ν‚€μ›Œλ“œ(var, let, const) etc.

leejaejae 2024. 7. 29. 15:50

1. λ³€μˆ˜λž€

  • ν•˜λ‚˜μ˜ 값을 μ €μž₯ν•˜κΈ° μœ„ν•΄ ν™•λ³΄ν•œ λ©”λͺ¨λ¦¬ 곡간 자체 λ˜λŠ” κ·Έ λ©”λͺ¨λ¦¬ 곡간을 μ‹λ³„ν•˜κΈ° μœ„ν•΄ 뢙인 이름

1) λ³€μˆ˜ μ„ μ–Έ

var score;
  • λ³€μˆ˜ μ„ μ–Έμ΄λž€ λ³€μˆ˜λ₯Ό μƒμƒν•˜λŠ” 것
  • 값을 μ €μž₯ν•˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•˜κ³  λ³€μˆ˜ 이름과 ν™•λ³΄λœ λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ μ£Όμ†Œλ₯Ό μ—°κ²°ν•΄μ„œ 값을 μ €μž₯ν•  수 있게 μ€€λΉ„ν•˜λŠ” 것
  • λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ λ°˜λ“œμ‹œ 선언이 ν•„μš”ν•˜κ³ , λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•ŒλŠ” var, let, const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•¨

 

2. μ‹λ³„μžλž€ ⭐️

  • μ‹λ³„μž(identifier)
    • λ³€μˆ˜μ˜ 이름, μ–΄λ–€ 값을 κ΅¬λ³„ν•΄μ„œ 식별할 수 μžˆλŠ” κ³ μœ ν•œ 이름, 값이 μ•„λ‹ˆλΌ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 기얡함
  • μ‹λ³„μžλΌλŠ” μš©μ–΄λŠ” λ³€μˆ˜ μ΄λ¦„μ—λ§Œ κ΅­ν•œν•΄μ„œ μ‚¬μš©ν•˜μ§€ μ•ŠμŒ. (예λ₯Ό λ“€μ–΄, λ³€μˆ˜, ν•¨μˆ˜, 클래슀 λ“±μ˜ 이름은 λͺ¨λ‘ μ‹λ³„μžμž„)
  • μ‹λ³„μžμΈ λ³€μˆ˜ μ΄λ¦„μœΌλ‘œλŠ” λ©”λͺ¨λ¦¬ 상에 μ‘΄μž¬ν•˜λŠ” λ³€μˆ˜ 값을 식별할 수 있고, ν•¨μˆ˜ μ΄λ¦„μœΌλ‘œλŠ” λ©”λͺ¨λ¦¬ 상에 μ‘΄μž¬ν•˜λŠ” ν•¨μˆ˜λ₯Ό 식별할 수 있음

  • 즉, λ©”λͺ¨λ¦¬ 상에 μ‘΄μž¬ν•˜λŠ” μ–΄λ–€ 값을 식별할 수 μžˆλŠ” 이름은 λͺ¨λ‘ μ‹λ³„μžλΌκ³  뢀름

1) μ‹λ³„μž 넀이밍 κ·œμΉ™

- μ‹λ³„μžλŠ” 특수문자λ₯Ό μ œμ™Έν•œ 문자, 숫자, μ–Έλ”μŠ€μ½”μ–΄(_), λ‹¬λŸ¬ 기호($)λ₯Ό 포함할 수 있음
- 단, 숫자둜 μ‹œμž‘ν•˜λŠ” 것은 ν—ˆμš©ν•˜μ§€ μ•ŠμŒ

2) 넀이밍 μ»¨λ²€μ…˜ μ’…λ₯˜

// 카멜 μΌ€μ΄μŠ€ (camelCase)
var firstName;

// μŠ€λ„€μ΄ν¬ μΌ€μ΄μŠ€ (snake_case)
var first_name;

// 파슀칼 μΌ€μ΄μŠ€ (PascalCase)
var FirstName;

// 헝가리언 μΌ€μ΄μŠ€ (typeHungarianCase)
var strFirstName; // type + identifier
var $elem = document.getElementById('myId'); // DOM λ…Έλ“œ
var observable$ = fromEvent(document, 'click'); // RxJS μ˜΅μ €λ²„λΈ”


3) λ¦¬ν„°λŸ΄μ΄λž€?

- λ¦¬ν„°λŸ΄(literal)은 μ‚¬λžŒμ΄ 이해할 수 μžˆλŠ” 문자 λ˜λŠ” μ•½μ†λœ 기호λ₯Ό μ‚¬μš©ν•΄ 값을 μƒμ„±ν•˜λŠ” ν‘œκΈ°λ²•(=notation)

 

3. ν˜Έμ΄μŠ€νŒ…μ΄λž€ ⭐️⭐️

console.log(score); // undefined;

var score; // λ³€μˆ˜ μ„ μ–Έλ¬Έ
  • λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…
    • λŸ°νƒ€μž„ 이전에 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— μ˜ν•΄ μ†ŒμŠ€μ½”λ“œ 평가 κ³Όμ •μ—μ„œ μŠ€μ½”ν”„μ— λ“±λ‘λ˜κ³  이λ₯Ό 마치 μ½”λ“œμ˜ 제일 μœ„μ— μžˆλŠ” κ²ƒμ²˜λŸΌ λ³€μˆ˜κ°€ 어디에 μœ„μΉ˜ν•˜λ˜μ§€μ™€ 상관없이 μ–΄λ””μ„œλ“ μ§€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” κ²ƒμ²˜λŸΌ λ§Œλ“œλŠ” νŠΉμ§•
    • (js 엔진은 λ³€μˆ˜ μ„ μ–Έ(을 ν¬ν•¨ν•œ λͺ¨λ“  μ„ μ–Έλ¬Έ)이 μ†ŒμŠ€ μ½”λ“œμ˜ 어디에 μžˆλ“  상관없이 λ‹€λ₯Έ μ½”λ“œλ³΄λ‹€ λ¨Όμ € 싀행함)
  • 사싀 λ³€μˆ˜ μ„ μ–ΈλΏλ§Œ μ•„λ‹ˆλΌ var, let, const, function, function*, class ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ μ„ μ–Έν•˜λŠ” λͺ¨λ“  μ‹λ³„μž(λ³€μˆ˜, ν•¨μˆ˜, 클래슀 λ“±)λŠ” ν˜Έμ΄μŠ€νŒ… 됨.(λͺ¨λ“  선언문은 λŸ°νƒ€μž„ 이전 λ‹¨κ³„μ—μ„œ λ¨Όμ € μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έ)

 

4. var ν‚€μ›Œλ“œλž€ 

  • var ν‚€μ›Œλ“œλŠ” 뒀에 μ˜€λŠ” λ³€μˆ˜ 이름을 μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  것을 μ§€μ‹œν•˜λŠ” ν‚€μ›Œλ“œμž„
  • ν‚€μ›Œλ“œλž€ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό ν•΄μ„ν•˜κ³  μ‹€ν–‰ν•˜λŠ”, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μˆ˜ν–‰ν•  동적을 κ·œμ •ν•œ μΌμ’…μ˜ λͺ…λ Ήμ–΄ (μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν‚€μ›Œλ“œλ₯Ό λ§Œλ‚˜λ©΄ μžμ‹ μ΄ μˆ˜ν–‰ν•΄μ•Ό ν•  μ•½μ†λœ λ™μž‘μ„ μˆ˜ν–‰ν•¨)
  • 예λ₯Ό λ“€μ–΄, var ν‚€μ›Œλ“œλ₯Ό λ§Œλ‚˜λ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 뒀에 μ˜€λŠ” λ³€μˆ˜ μ΄λ¦„μœΌλ‘œ μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό μ„ μ–Έ

  • λ³€μˆ˜λ₯Ό μ„ μ–Έν•œ 이후, 아직 λ³€μˆ˜μ— 값을 ν• λ‹Ήν•˜μ§€ μ•Šμ•˜μ§€λ§Œ ν™•λ³΄λœ λ©”λͺ¨λ¦¬ κ³΅κ°„μ—λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ undefinedλΌλŠ” 값이 μ•”λ¬΅μ μœΌλ‘œ ν• λ‹Ήλ˜μ–΄ μ΄ˆκΈ°ν™”λ¨

1) var ν‚€μ›Œλ“œ 문제점 ⭐️

β‘  λ³€μˆ˜ 쀑볡 μ„ μ–Έ ν—ˆμš©

function foo() {
  var x = 1;
  // var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” 같은 μŠ€μ½”ν”„ λ‚΄μ—μ„œ 쀑볡 선언을 ν—ˆμš©ν•œλ‹€.
  // μ•„λž˜ λ³€μˆ˜ 선언문은 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ var ν‚€μ›Œλ“œκ°€ μ—†λŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•œλ‹€.
  var x = 2;
  console.log(x); // 2
}
foo();

- var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” 같은 μŠ€μ½”ν”„ λ‚΄μ—μ„œ 쀑볡 선언이 ν—ˆμš©λ˜λŠ”λ°, μ΄λŠ” μ˜λ„μΉ˜ μ•Šκ²Œ λ³€μˆ˜κ°’μ΄ μž¬ν• λ‹Ήλ˜μ–΄ λ³€κ²½λ˜λŠ” λΆ€μž‘μš©μ„ λ°œμƒμ‹œν‚΄

β‘‘ ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„

case 1 : var ν‚€μ›Œλ“œλ‘œ λ³€μˆ˜ μ„ μ–Έ

var x = 1;

if (true) {
  // var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” ν•¨μˆ˜μ˜ μ½”λ“œ 블둝(ν•¨μˆ˜ λͺΈμ²΄)λ§Œμ„ 지역 μŠ€μ½”ν”„λ‘œ μΈμ •ν•œλ‹€.
  // ν•¨μˆ˜ λ°–μ—μ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” μ½”λ“œ 블둝 λ‚΄μ—μ„œ μ„ μ–Έλ˜μ—ˆλ‹€ 할지라도 λͺ¨λ‘ μ „μ—­ λ³€μˆ˜λ‹€.
  // λ”°λΌμ„œ xλŠ” μ „μ—­ λ³€μˆ˜λ‹€. 이미 μ„ μ–Έλœ μ „μ—­ λ³€μˆ˜ xκ°€ μžˆμœΌλ―€λ‘œ x λ³€μˆ˜λŠ” 쀑볡 μ„ μ–Έλœλ‹€.
  // μ΄λŠ” μ˜λ„μΉ˜ μ•Šκ²Œ λ³€μˆ˜ 값이 λ³€κ²½λ˜λŠ” λΆ€μž‘μš©μ„ λ°œμƒμ‹œν‚¨λ‹€.
  var x = 10;
}
console.log(x); // 10


case 2 : var ν‚€μ›Œλ“œλ‘œ forλ¬Έ μ•ˆμ˜ λ³€μˆ˜ μ„ μ–Έ

var i = 10;

// for λ¬Έμ—μ„œ μ„ μ–Έν•œ iλŠ” μ „μ—­ λ³€μˆ˜λ‹€. 이미 μ„ μ–Έλœ μ „μ—­ λ³€μˆ˜ iκ°€ μžˆμœΌλ―€λ‘œ 쀑볡 μ„ μ–Έλœλ‹€.
for (var i = 0; i < 5; i++) {
  console.log(i); // 0 1 2 3 4
}

// μ˜λ„μΉ˜ μ•Šκ²Œ λ³€μˆ˜μ˜ 값이 λ³€κ²½λ˜μ—ˆλ‹€.
console.log(i); // 5

 - λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λŠ” ν•¨μˆ˜ λͺΈμ²΄λ§Œμ΄ μ•„λ‹ˆλΌ λͺ¨λ“  μ½”λ“œ 블둝(if, for, while, try/catch λ“±)이 지역 μŠ€μ½”ν”„λ₯Ό λ§Œλ“¬. μ΄λŸ¬ν•œ νŠΉμ„±μ„ λΈ”둝 레벨 μŠ€μ½”ν”„λΌκ³  함.
- ν•˜μ§€λ§Œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” μ˜€λ‘œμ§€ ν•¨μˆ˜μ˜ μ½”λ“œ 블둝(ν•¨μˆ˜ λͺΈμ²΄)λ§Œμ„ 지역 μŠ€μ½”ν”„λ‘œ 인정함(이런 νŠΉμ„±μ„ ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„λΌκ³  함)

β‘’ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…

console.log(score); // undefined;

var score; // λ³€μˆ˜ μ„ μ–Έλ¬Έ

- var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” μ„ μ–Έκ³Ό λ™μ‹œμ— undefined둜 μ΄ˆκΈ°ν™”λ˜λ©°, λŸ°νƒ€μž„ 즉 μ†ŒμŠ€μ½”λ“œ 평사 λ‹¨κ³„μ—μ„œ μŠ€μ½”ν”„μ— λ“±λ‘λ˜κΈ° λ•Œλ¬Έμ— μ‹€ν–‰ λ‹¨κ³„μ—μ„œ μ‹€μ œ 값이 ν• λ‹Ήλ˜μ§€ μ•Šλ”λΌλ„ undefindedλ₯Ό 가짐

 

5. let ν‚€μ›Œλ“œλž€ 

  • var ν‚€μ›Œλ“œμ˜ 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ ES6μ—μ„œ λ„μž…λœ μƒˆλ‘œμš΄ ν‚€μ›Œλ“œμž„

1) let ν‚€μ›Œλ“œ vs. var ν‚€μ›Œλ“œ ⭐️⭐️

β‘  λ³€μˆ˜ 쀑볡 μ„ μ–Έ κΈˆμ§€

let bar = 123;
// letμ΄λ‚˜ const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” 같은 μŠ€μ½”ν”„ λ‚΄μ—μ„œ 쀑볡 선언을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
let bar = 456; // SyntaxError: Identifier 'bar' has already been declared

- var ν‚€μ›Œλ“œλ‘œ 이름이 λ™μΌν•œ λ³€μˆ˜λ₯Ό 쀑볡 μ„ μ–Έν•˜λ©΄ μ•„λ¬΄λŸ° μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠμŒ. μ΄λ•Œ λ³€μˆ˜λ₯Ό 쀑볡 μ„ μ–Έν•˜λ©΄μ„œ κ°’κΉŒμ§€ ν• λ‹Ήν•˜λ©΄ μ˜λ„μΉ˜ μ•Šκ²Œ λ¨Όμ € μ„ μ–Έλœ λ³€μˆ˜ 값이 μž¬ν• λ‹Ήλ˜μ–΄ λ³€κ²½λ˜λŠ” λΆ€μž‘μš©μ΄ λ°œμƒν•¨.
- ν•˜μ§€λ§Œ let ν‚€μ›Œλ“œλ‘œ 이름이 같은 λ³€μˆ˜λ₯Ό 쀑볡 μ„ μ–Έν•˜λ©΄ 문법 μ—λŸ¬(SyntaxError)κ°€ λ°œμƒν•¨

β‘‘ 블둝 레벨 μŠ€μ½”ν”„

let foo = 1; // μ „μ—­ λ³€μˆ˜

{
  let foo = 2; // 지역 λ³€μˆ˜
  let bar = 3; // 지역 λ³€μˆ˜
}

console.log(foo); // 1
console.log(bar); // ReferenceError: bar is not defined

- let ν‚€μ›Œλ“œλ₯Ό 톡해 μ„ μ–Έλœ λ³€μˆ˜λŠ” 블둝 레벨 μŠ€μ½”ν”„λ₯Ό 따름
- ν•¨μˆ˜ 뿐만 μ•„λ‹ˆλΌ λͺ¨λ“  μ½”λ“œ 블둝 내에 μ„ μ–Έλœ λ³€μˆ˜(지역 λ³€μˆ˜)λŠ” ν•΄λ‹Ή 유효 λ²”μœ„(μŠ€μ½”ν”„)λ₯Ό λ²—μ–΄λ‚˜λ©΄ μ‚¬μš©ν•  수 μ—†μŒ

β‘’ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ… ⭐️⭐️
- let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•¨

console.log(foo); // Cannot access 'foo' before initialization
let foo;

- var ν‚€μ›Œλ“œμ˜€λ‹€λ©΄ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ λŸ°νƒ€μž„ 이전에 λ³€μˆ˜κ°€ μ„ μ–Έλ˜μ–΄ undefinedλ₯Ό 좜λ ₯해야함. ν•˜μ§€λ§Œ let ν‚€μ›Œλ“œμ—μ„œλŠ” μ°Έμ‘°μ—λŸ¬κ°€ λ‚˜νƒ€λ‚¨

- let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” 'μ„ μ–Έ 단계'와 'μ΄ˆκΈ°ν™” 단계'κ°€ λΆ„λ¦¬λ˜μ–΄ 진행됨.
- 즉, λŸ°νƒ€μž„ 이전에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ μ„ μ–Έ 단계가 λ¨Όμ € μ‹€ν–‰λ˜μ§€λ§Œ μ΄ˆκΈ°ν™” λ‹¨κ³„λŠ” λ³€μˆ˜ 선언문에 λ„λ‹¬ν–ˆμ„ λ•Œ 싀행됨.
- λ§Œμ•½ μ΄ˆκΈ°ν™” 단계가 μ‹€ν–‰λ˜κΈ° 이전에 λ³€μˆ˜μ— μ ‘κ·Όν•˜λ €κ³  ν•˜λ©΄ μ°Έμ‘° μ—λŸ¬κ°€ λ°œμƒν•¨

- let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μŠ€μ½”ν”„μ˜ μ‹œμž‘ 지점뢀터 μ΄ˆκΈ°ν™” 단계 μ‹œμž‘ 지점(λ³€μˆ˜ μ„ μ–Έλ¬Έ)κΉŒμ§€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†μŒ.
- μŠ€μ½”ν”„μ˜ μ‹œμž‘ 지점뢀터 μ΄ˆκΈ°ν™” μ‹œμž‘ μ§€μ κΉŒμ§€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†λŠ” ꡬ간을 μΌμ‹œμ  μ‚¬κ°μ§€λŒ€(TDZ: Temporal Dead Zone)라 뢀름

// λŸ°νƒ€μž„ 이전에 μ„ μ–Έ 단계가 μ‹€ν–‰λœλ‹€. 아직 λ³€μˆ˜κ°€ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ•˜λ‹€.
// μ΄ˆκΈ°ν™” μ΄μ „μ˜ μΌμ‹œμ  사각 μ§€λŒ€μ—μ„œλŠ” λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†λ‹€.
console.log(foo); // ReferenceError: foo is not defined

let foo; // λ³€μˆ˜ μ„ μ–Έλ¬Έμ—μ„œ μ΄ˆκΈ°ν™” 단계가 μ‹€ν–‰λœλ‹€.
console.log(foo); // undefined

foo = 1; // ν• λ‹Ήλ¬Έμ—μ„œ ν• λ‹Ή 단계가 μ‹€ν–‰λœλ‹€.
console.log(foo); // 1


β‘£ μ „μ—­ 객체와 let

let x = 1;

// let, const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λŠ” μ „μ—­ 객체 window의 ν”„λ‘œνΌν‹°κ°€ μ•„λ‹ˆλ‹€.
console.log(window.x); // undefined
console.log(x); // 1

- let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ μ•„λ‹˜(즉, window.foo와 같이 μ ‘κ·Όν•  수 μ—†μŒ)

 

6. const ν‚€μ›Œλ“œλž€

- const ν‚€μ›Œλ“œλŠ” μƒμˆ˜(constant)λ₯Ό μ„ μ–Έν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜μ§€λ§Œ, λ°˜λ“œμ‹œ μƒμˆ˜λ§Œμ„ μœ„ν•΄ μ‚¬μš©ν•˜μ§€λŠ” μ•ŠμŒ
- const ν‚€μ›Œλ“œμ˜ νŠΉμ§•μ€ letκ³Ό λŒ€λΆ€λΆ„ 동일

1) const ν‚€μ›Œλ“œ νŠΉμ§• ⭐️

β‘  μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™”

const bar = 1;
console.log(bar); >>> 1

const foo;
console.log(foo); >>> // SyntaxError: Missing initializer in const declaration

- const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ°˜λ“œμ‹œ μ„ μ–Έκ³Ό λ™μ‹œμ— μ΄ˆκΈ°ν™”ν•΄μ•Ό 함. μ•ˆκ·ΈλŸΌ 문법 μ—λŸ¬(SyntaxError) λ°œμƒ

β‘‘ μž¬ν• λ‹Ή κΈˆμ§€

const foo = 1;
foo = 2; // TypeError: Assignment to constant variable.

- var λ˜λŠ” let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μž¬ν• λ‹Ήμ΄ μžμœ λ‘œμš°λ‚˜ const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μž¬ν• λ‹Ήμ΄ κΈˆμ§€μž„

β‘’ μƒμˆ˜

// μ„Έμœ¨μ„ μ˜λ―Έν•˜λŠ” 0.1은 λ³€κ²½ν•  수 μ—†λŠ” μƒμˆ˜λ‘œμ„œ μ‚¬μš©λ  값이닀.
// λ³€μˆ˜ 이름을 λŒ€λ¬Έμžλ‘œ μ„ μ–Έν•΄ μƒμˆ˜μž„μ„ λͺ…ν™•νžˆ λ‚˜νƒ€λ‚Έλ‹€.
const TAX_RATE = 0.1;

// μ„Έμ „ 가격
let preTaxPrice = 100;

// μ„Έν›„ 가격
let afterTaxPrice = preTaxPrice + preTaxPrice * TAX_RATE;

console.log(afterTaxPrice); // 110

- const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜μ— μ›μ‹œ 값을 ν• λ‹Ήν•œ 경우 λ³€μˆ˜ 값을 λ³€κ²½ν•  수 μ—†μŒ
- μ›μ‹œ 값은 λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’μ΄λ―€λ‘œ μž¬ν• λ‹Ή 없이 값을 λ³€κ²½ν•  수 μžˆλŠ” 방법이 μ—†κΈ° λ•Œλ¬Έμž„
- μ΄λŸ¬ν•œ νŠΉμ§•μ„ μ΄μš©ν•΄ const ν‚€μ›Œλ“œλ₯Ό μƒμˆ˜λ₯Ό ν‘œν˜„ν•˜λŠ” 데 μ‚¬μš©