javascript/DeepDive

[Js λ”₯λ‹€μ΄λΈŒ] 15. let, const

hw.kr 2022. 11. 14. 17:03

πŸ“Œ var ν‚€μ›Œλ“œμ˜ 단점

 

1. λ³€μˆ˜μ˜ 쀑볡 μ„ μ–Έ ν—ˆμš©

 

var x = 10;
console.log(x);

var x = 20;
console.log(x);

 

이미 μ„ μ–Έλ˜κ³  μ΄ˆκΈ°ν™”κΉŒμ§€ μ™„λ£Œλœ λ³€μˆ˜ x 의 쀑볡선언을 ν—ˆμš©ν•œλ‹€.

μ „μ—­λ³€μˆ˜κ°€ μ˜λ„μΉ˜μ•Šκ²Œ 값이 λ³€κ²½λ˜λ©΄ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¬ κ°€λŠ₯성이 맀우 λ†’λ‹€.

 

2. ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„

 

var x = 1;

if(true){
    var x = 10;
}

console.log(x);

 

ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜κ°€ μ•„λ‹ˆλ©΄, μŠ€μ½”ν”„λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  μ „μ—­λ³€μˆ˜λ‘œ μ·¨κΈ‰ν•œλ‹€.

이 문제 μ—­μ‹œ μ˜λ„μΉ˜ μ•Šκ²Œ λ³€μˆ˜ 값을 λ³€κ²½μ‹œν‚¨λ‹€.

 

3. ν˜Έμ΄μŠ€νŒ…

 

console.log(x);
var x = 1;

 

λŸ°νƒ€μž„ 이전 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄μ„œ 선언문이 제일 μ„ λ‘λ‘œ λŒμ–΄ μ˜¬λ €μ§€κ³  undefined 둜 μ΄ˆκΈ°ν™”λœλ‹€.

μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ°μ „μ— 이미 μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™” 단계λ₯Ό 마친 것이 λœλ‹€.

μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€μ§€λŠ” μ•Šμ§€λ§Œ μ΄λ ‡κ²Œ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것은 잘λͺ»λœ 방법이닀.

 

πŸ’‘ var ν‚€μ›Œλ“œλŠ” λΈŒλΌμš°μ €μ˜ μ „μ—­ 객체 window 의 ν”„λ‘œνΌν‹°κ°€ λœλ‹€.

 

var a = 10;
console.log(window.a);

 

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ΄λ ‡κ²Œ μ ‘κ·Όν•  수 도 μžˆλ‹€.

let, const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ „μ—­κ°μ²΄μ˜ ν”„λ‘œνΌν‹°κ°€ μ•„λ‹ˆλ‹€.

 

μœ„μ˜ 3문제λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ” let, const ν‚€μ›Œλ“œλ₯Ό μ•Œμ•„λ³΄μž!

2개의 ν‚€μ›Œλ“œλŠ” λΉ„μŠ·ν•˜μ§€λ§Œ μ•½κ°„ λ‹€λ₯΄λ‹€.

 

1️⃣ let

 

1. λ³€μˆ˜μ˜ 쀑볡 μ„ μ–Έ ν—ˆμš© x

 

let ν‚€μ›Œλ“œλŠ” 같은 μŠ€μ½”ν”„μ—μ„œ λ³€μˆ˜μ˜ 쀑볡 선언을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

μ „μ—­λ³€μˆ˜μ˜ μ˜λ„μΉ˜ μ•Šμ€ 변경을 막을 수 μžˆλ‹€.

 

let x = 10;
console.log(x);
let x = 5;
console.log(x); // Uncaught SyntaxError: Identifier 'x' has already been declared

 

 

2. 블둝 레벨 μŠ€μ½”ν”„

 

let ν‚€μ›Œλ“œλŠ” 블둝 레벨 μŠ€μ½”ν”„λ‘œμ¨, 블둝을 ν•˜λ‚˜μ˜ μŠ€μ½”ν”„λ‘œ 인정해쀀닀

 

let x = 10;

if (true){
    let x = 5;
    console.log(x); // 5
}

console.log(x); // 10

 

 

var ν‚€μ›Œλ“œμ˜ ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„μ˜ 경우 처럼, λ³€μˆ˜μ˜ 이름이 같아도 μ„ μ–Έ μ‹œμ μ˜ μŠ€μ½”ν”„κ°€ λ‹€λ₯΄λ‹€λ©΄ λ‹€λ₯Έ λ³€μˆ˜λ‘œ μ·¨κΈ‰ν•˜κ³  각각 λ‹€λ₯Έ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό μ‹λ³„ν•œλ‹€.

 

let x = 10;

function go(){
    let x = 20;

    for(let x = 1; x <= 5; x ++){
        console.log(x); // 1 2 3 4 5
    }

    console.log(x); // 20
}

console.log(x); // 10

 

ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλ„ μ€‘μ²©λœ ν•˜λ‚˜μ˜ μŠ€μ½”ν”„λ₯Ό μƒμ„±ν•œλ‹€.

 

3. ν˜Έμ΄μŠ€νŒ…

 

🧐 let ν‚€μ›Œλ“œλŠ” ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” 것 처럼 λ™μž‘ν•œλ‹€?!

 

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜κ°€ ν˜Έμ΄μŠ€νŒ…μœΌλ‘œ 인해 undefined 값에 μ ‘κ·Όν•  수 μžˆμ—ˆλ˜ μ΄μœ λŠ” λŸ°νƒ€μž„ 이전에 

"μ„ μ–Έ 단계" 와 "μ΄ˆκΈ°ν™”(undefined) 단계" λ₯Ό λͺ¨λ‘ 거치기 λ•Œλ¬Έμ΄λ‹€.

 

ν•˜μ§€λ§Œ, let ν‚€μ›Œλ“œλ₯Ό 톡해 μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ„ μ–Έ, μ΄ˆκΈ°ν™” 단계가 λΆ„λ¦¬λ˜μ–΄ μ‹€ν–‰ λœλ‹€.

λŸ°νƒ€μž„ μ΄μ „μ—λŠ” μ„ μ–Έ λ‹¨κ³„λ§Œ 거치고, μ‹€ν–‰ 이후 μ½”λ“œ μƒμ—μ„œ 값을 ν• λ‹Ήν•΄μ£ΌλŠ” λ³€μˆ˜ 선언문을 λ§Œλ‚˜μ•Όμ§€ λ³€μˆ˜κ°€ μ΄ˆκΈ°ν™” λœλ‹€.

λ”°λΌμ„œ 이 μ‹œμ  μ‚¬μ΄μ—μ„œλŠ” λ³€μˆ˜μ— μ ‘κ·Όν•  수 μ—†κ²Œ λœλ‹€. 이 μ‹œμ μ„ μΌμ‹œμ  μ‚¬κ°μ§€λŒ€ 라고 ν•œλ‹€

 

κ·Έλ ‡λ‹€λ©΄ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” 것인가?

μ•„λ‹ˆλ‹€. ν˜Έμ΄μŠ€νŒ…μ€ μ—¬μ „νžˆ λ°œμƒν•œλ‹€.

μŠ€μ½”ν”„μ—μ„œ ν˜Έμ΄μŠ€νŒ…μ€ μŠ€μ½”ν”„ λ‹¨μœ„λ‘œ λ°œμƒν•œλ‹€κ³  ν–ˆμ—ˆλ‹€.

 

let x = 10;

if(true){
    console.log(x); // Uncaught ReferenceError: Cannot access 'x' before initialization
    let x = 5;
    console.log(x); // 5
}

 

let ν‚€μ›Œλ“œλŠ” 블둝 레벨 μŠ€μ½”ν”„ μ΄λ―€λ‘œ, ν˜Έμ΄μŠ€νŒ…λ„ 블둝 λ ˆλ²¨μ—μ„œ λ°œμƒν•œλ‹€.

μœ„μ˜ μ½”λ“œμ—μ„œ μ „μ—­λ³€μˆ˜ 10을 좜λ ₯ ν•΄μ•Όν•˜λŠ”κ±° μ•„λ‹Œκ°€? μ΄λ ‡κ²Œ 생각할 수 μžˆμ§€λ§Œ ν˜Έμ΄μŠ€νŒ…μœΌλ‘œ μΈν•΄μ„œ 블둝 λ‚΄μ—μ„œ μΌμ‹œμ  사각 μ§€λŒ€κ°€ μƒμ„±λ˜λ―€λ‘œ x 에 μ ‘κ·Όν•  수 μ—†κ²Œλœλ‹€.

 

2️⃣ const

μ•„λž˜μ˜ 2κ°€μ§€λ₯Ό μ œμ™Έν•˜κ³  let ν‚€μ›Œλ“œμ™€ 같은 νŠΉμ§•μ„ κ°€μ§„λ‹€.

 

1. const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ„ μ–Έν•  λ•Œ 무쑰건 μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™”λ₯Ό λ™μ‹œμ— ν•΄μ€˜μ•Ό ν•œλ‹€.

 

var x ;
x = 10;
console.log(x); // 10

let y ;
y = 20;
console.log(y); // 20

const z;
z = 30;
console.log(z); // Uncaught SyntaxError: Missing initializer in const declaration

 

2. μ›μ‹œ 값을 μ‹λ³„ν•˜λŠ” λ³€μˆ˜μ˜ μž¬ν• λ‹Ήμ΄ λΆˆκ°€λŠ₯ ν•˜λ‹€.

 

const z = 30;
console.log(z); // 30
z = 10;
console.log(z); // Uncaught TypeError: Assignment to constant variable.

const user = { 
    userId : 'woong';
}
 
console.log(user.userId); // woong
user.userId = 'choi';
console.log(user.userId); // choi

 

μ›μ‹œ 값을 μ‹λ³„ν•˜λŠ” λ³€μˆ˜ 값을 λ³€κ²½ν•˜λŠ” μœ μΌν•œ 방법은 μž¬ν• λ‹Ή 이라고 ν–ˆμ—ˆλ‹€

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

 

🧐 μ›μ‹œ, 객체 κ°’ λͺ¨λ‘ const ν‚€μ›Œλ“œλ‘œ μ‹λ³„ν•˜λ©΄ λ³€κ²½ν•  수 μ—†λŠ”κ°€?

 

κ°μ²΄λŠ” "λ³€κ²½ κ°€λŠ₯ν•œ κ°’" 이닀.

λ”°λΌμ„œ, const ν‚€μ›Œλ“œλ‘œ 식별해도 변경이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— 객체 λ¦¬ν„°λŸ΄λ‘œ μƒμ„±ν•œ 객체의 ν”„λ‘œνΌν‹°λ₯Ό λ™μ μœΌλ‘œ 관리할 수 μžˆλ‹€.

 

μž¬ν• λ‹Ή κΈˆμ§€μ™€ λΆˆλ³€μ„ 같은 의미둜 받아듀이지 말자.

μ›μ‹œ 값은 기본적으둜 "λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’" μ΄λΌμ„œ λ³€μˆ˜ 값을 λ³€κ²½ν•˜λŠ” μœ μΌν•œ 방법이 μž¬ν• λ‹ΉμΈλ°, const ν‚€μ›Œλ“œλŠ” 이것을 κΈˆμ§€ ν•œλ‹€.

λ”°λΌμ„œ λ³€μˆ˜ κ°’ 변경이 ν—ˆμš©λ˜μ§€ μ•ŠλŠ” 것이닀.