πŸ’» Programming/JS, TS

[JavaScript] var, let, const

Jiwon() 2023. 6. 20. 14:29


1. λ³€μˆ˜λž€?

1) μ •μ˜

  • ν•˜λ‚˜μ˜ 값을 μ €μž₯ν•˜κΈ° μœ„ν•΄ ν™•λ³΄ν•œ λ©”λͺ¨λ¦¬ 곡간 자체 λ˜λŠ” κ·Έ λ©”λͺ¨λ¦¬ 곡간을 μ‹λ³„ν•˜κΈ° μœ„ν•΄ 뢙인 이름
  • κΈ°μ–΅ν•˜κ³  싢은 데이터 값을 λ©”λͺ¨λ¦¬μ— μ €μž₯ν•˜κ³ , μ €μž₯된 데이터 값을 μž¬μ‚¬μš©ν•˜κΈ° μœ„ν•΄ μ‚¬μš©
  • μ‹λ³„μž: λ³€μˆ˜μ˜ 이름을 'μ‹λ³„μž(identifier)'라고도 ν•˜λŠ”λ°, μ‹λ³„μžλŠ” κ°’ μžμ²΄κ°€ μ•„λ‹Œ 값을 μ €μž₯ν•˜κ³  μžˆλŠ” λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό κΈ°μ–΅ν•œλ‹€. μ‹λ³„μžλŠ” λ³€μˆ˜λͺ…에 κ΅­ν•œλœ κ°œλ…μ΄ μ•„λ‹ˆκ³ , λ³€μˆ˜, ν•¨μˆ˜, 클래슀 λ“±μ˜ 이름은 λͺ¨λ‘ μ‹λ³„μžλΌκ³  ν•  수 μžˆλ‹€.

 

2) λ³€μˆ˜μ˜ 생성 3단계 - μ„ μ–Έ, μ΄ˆκΈ°ν™”, ν• λ‹Ή

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

  • λ³€μˆ˜ μ„ μ–Έμ΄λž€ λ³€μˆ˜λ₯Ό μƒμ„±ν•˜λŠ” 것, 즉 값을 μ €μž₯ν•˜κΈ° μœ„ν•΄ λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•˜κ³  λ³€μˆ˜λͺ…κ³Ό ν™•λ³΄λœ λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ μ£Όμ†Œλ₯Ό μ—°κ²°ν•΄μ„œ 값을 μ €μž₯ν•  수 μžˆλ„λ‘ μ€€λΉ„ν•˜λŠ” 것을 λ§ν•œλ‹€.
  • λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•ŒλŠ” var, let, const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
var number // console.log(number) = undefined
let i
const result

 

(2) λ³€μˆ˜ μ΄ˆκΈ°ν™”

λ³€μˆ˜ 객체에 λ“±λ‘λœ λ³€μˆ˜λ₯Ό λ©”λͺ¨λ¦¬μ— ν• λ‹Ήν•œλ‹€. 이 λ‹¨κ³„μ—μ„œ λ³€μˆ˜λŠ” undefined둜 μ΄ˆκΈ°ν™”λœλ‹€.

 

(3) κ°’μ˜ ν• λ‹Ή

  • λ³€μˆ˜μ— 값을 μ €μž₯ν•˜λŠ” 것을 λ§ν•œλ‹€.
  • λ³€μˆ˜μ— 값을 ν• λ‹Ήν•  λ•ŒλŠ” ν• λ‹Ή μ—°μ‚°μž '='λ₯Ό μ‚¬μš©ν•˜κ³ , ν• λ‹Ή μ—°μ‚°μžλŠ” μš°λ³€μ˜ 값을 μ’Œλ³€μ˜ λ³€μˆ˜μ— ν• λ‹Ήν•œλ‹€.
let score; // λ³€μˆ˜ μ„ μ–Έ
score = 100; // κ°’μ˜ ν• λ‹Ή

let score = 100; // λ³€μˆ˜ μ„ μ–Έκ³Ό κ°’μ˜ 할당을 ν•˜λ‚˜μ˜ 문으둜 ν‘œν˜„
  • μ—¬κΈ°μ„œ μœ μ˜ν•  점은, λ³€μˆ˜ μ„ μ–Έκ³Ό κ°’μ˜ ν• λ‹Ήμ˜ μ‹€ν–‰ μ‹œμ μ΄ λ‹€λ₯΄λ‹€λŠ” 것이닀. λ³€μˆ˜ 선언은 λŸ°νƒ€μž„ 이전에 λ¨Όμ € μ‹€ν–‰λ˜μ§€λ§Œ, κ°’μ˜ 할당은 λŸ°νƒ€μž„μ— μ‹€ν–‰λœλ‹€.
μžμ„Έν•œ 것은 3. λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ… μ°Έκ³ 

 

3) κ°’μ˜ μž¬ν• λ‹Ή, λ³€μˆ˜ μ°Έμ‘°

(1) κ°’μ˜ μž¬ν• λ‹Ή

  • κ°’μ˜ μž¬ν• λ‹Ήμ΄λž€ 이미 값이 ν• λ‹Ήλ˜μ–΄ μžˆλŠ” λ³€μˆ˜μ— μƒˆλ‘œμš΄ 값을 또 λ‹€μ‹œ ν• λ‹Ήν•˜λŠ” 것을 λ§ν•œλ‹€.
  • var, let으둜 μ„ μ–Έν•œ λ³€μˆ˜λŠ” 값을 μž¬ν• λ‹Ήν•  수 μžˆμ§€λ§Œ, const둜 μ„ μ–Έλœ λ³€μˆ˜λŠ” μž¬ν• λ‹Ήμ΄ λΆˆκ°€λŠ₯ν•˜λ‹€.
let score = 100;
score = 90; // κ°’μ˜ μž¬ν• λ‹Ή

 

(2) λ³€μˆ˜ μ°Έμ‘°

  • λ³€μˆ˜ μ°Έμ‘°λž€ λ³€μˆ˜μ— μ €μž₯된 값을 μ½μ–΄λ“€μ΄λŠ” 것을 λ§ν•œλ‹€.
const number = 10
number // 10, λ³€μˆ˜ μ°Έμ‘°

 

 


2. var, let, const

1) var vs. let vs. const

  • varλŠ” ES5κΉŒμ§€ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆλŠ” μœ μΌν•œ λ°©λ²•μ΄μ—ˆμœΌλ‚˜, ES6μ—μ„œ letκ³Ό const으둜 λ³€μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆκ²Œλ˜μ—ˆλ‹€.
  • var둜 μ„ μ–Έλœ λ³€μˆ˜λŠ” μž¬ν• λ‹Ήκ³Ό 쀑볡 선언이 λͺ¨λ‘ κ°€λŠ₯ν•΄μ„œ, λ™μΌν•œ μ΄λ¦„μ˜ λ³€μˆ˜κ°€ μ„ μ–Έλ˜μ–΄ μžˆλŠ” 것을 λͺ¨λ₯΄κ³  μ€‘λ³΅λœ μ΄λ¦„μœΌλ‘œ μ„ μ–Έν•˜λ”λΌλ„ μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•Šμ•„ 였λ₯˜λ₯Ό λ°œμƒν•  κ°€λŠ₯성이 λ†’λ‹€.
  • λ”°λΌμ„œ varλ₯Ό μ‚¬μš©ν•˜λŠ” λŒ€μ‹  letκ³Ό constλ₯Ό μ‚¬μš©ν•œλ‹€. (var μ‚¬μš©μ΄ λΆˆκ°€λŠ₯ν•œ 것은 μ•„λ‹˜)
  • λ³€μˆ˜ μ„ μ–Έμ—λŠ” 기본적으둜 constλ₯Ό μ‚¬μš©ν•˜κ³ , μž¬ν• λ‹Ήμ΄ ν•„μš”ν•œ κ²½μš°μ—λ§Œ ν•œμ •ν•˜μ—¬ let을 μ‚¬μš©ν•œλ‹€.

 

2) μž¬ν• λ‹Ή 및 쀑볡선언 μ—¬λΆ€

  • var : μž¬ν• λ‹Ή κ°€λŠ₯, 쀑볡선언 κ°€λŠ₯
  • let : μž¬ν• λ‹Ή κ°€λŠ₯, 쀑볡선언 λΆˆκ°€λŠ₯
  • const : μž¬ν• λ‹Ή λΆˆκ°€λŠ₯, 쀑볡선언 λΆˆκ°€λŠ₯
λ³€ν™”ν•˜μ§€ μ•ŠλŠ” λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•ŒλŠ” let λŒ€μ‹  constλ₯Ό μ‚¬μš©ν•œλ‹€. const둜 μ„ μ–Έν•œ λ³€μˆ˜λ₯Ό 'μƒμˆ˜(constant)'라고 ν•˜κ³ , μƒμˆ˜λŠ” μž¬ν• λ‹Ήν•  수 μ—†μœΌλ―€λ‘œ μƒμˆ˜λ₯Ό λ³€κ²½ν•˜λ €κ³  ν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

 

3)  μŠ€μ½”ν”„

  • μŠ€μ½”ν”„λž€ μ‹λ³„μžμ˜ μœ νš¨λ²”μœ„(μ ‘κ·Όν•  수 μžˆλŠ” λ²”μœ„)λ₯Ό μ˜λ―Έν•œλ‹€.
  • var : ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„
  • let, const : 블둝 레벨 μŠ€μ½”ν”„

좜처 https://blog.devgenius.io/understanding-scope-in-javascript-f88e946636ac


- ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„ : ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ μŠ€μ½”ν”„λ₯Ό μƒμ„±ν•˜λ©°, ν•¨μˆ˜ λ‚΄μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” κ·Έ ν•¨μˆ˜ λ‚΄μ—μ„œλ§Œ μœ νš¨ν•˜κ³ , ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œλŠ” μ°Έμ‘°ν•  수 μ—†μŒ
- 블둝 레벨 μŠ€μ½”ν”„ : μ½”λ“œ 블둝(ν•¨μˆ˜, ifλ¬Έ, forλ¬Έ, whileλ¬Έ λ“±) λ‚΄μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λŠ” κ·Έ μ½”λ“œ 블둝 λ‚΄μ—μ„œλ§Œ μœ νš¨ν•˜λ©°, μ½”λ“œ 블둝 μ™ΈλΆ€μ—μ„œλŠ” μ°Έμ‘°ν•  수 μ—†μŒ

 

4) ν˜Έμ΄μŠ€νŒ…(hositing)

  • ν˜Έμ΄μŠ€νŒ…μ΄λž€, λͺ¨λ“  선언문이 ν•΄λ‹Ή μŠ€μ½”ν”„μ˜ 맨 μœ„λ‘œ λŒμ–΄ μ˜¬λ €μ§„ κ²ƒμ²˜λŸΌ λ™μž‘ν•˜λŠ” νŠΉμ„±μ„ μ˜λ―Έν•œλ‹€.
  • var, let, const와 같은 λ³€μˆ˜λΏλ§Œ μ•„λ‹ˆλΌ function, class ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ μ–Έν•˜λŠ” λͺ¨λ“  μ‹λ³„μž(λ³€μˆ˜, ν•¨μˆ˜, 클래슀 λ“±)λŠ” ν˜Έμ΄μŠ€νŒ… λœλ‹€.
  • 단, letκ³Ό constλŠ” var와 달리 ν˜Έμ΄μŠ€νŒ… μ‹œ undefined둜 λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€. λ”°λΌμ„œ λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”λ₯Ό μˆ˜ν–‰ν•˜κΈ° 전에 μ½λŠ” μ½”λ“œκ°€ λ¨Όμ € λ‚˜νƒ€λ‚˜λ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.
// 예제 1
// y만 ν˜Έμ΄μŠ€νŒ… λŒ€μƒ

x = 1; // x μ΄ˆκΈ°ν™”. xλ₯Ό μ„ μ–Έν•˜μ§€ μ•Šμ€ 경우 μ„ μ–Έ. κ·ΈλŸ¬λ‚˜ λͺ…령문에 varκ°€ μ—†μœΌλ―€λ‘œ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠμŒ
console.log(x + " " + y); // '1 undefined'
// JavaScriptλŠ” μ„ μ–Έλ§Œ ν˜Έμ΄μŠ€νŒ…ν•˜λ―€λ‘œ, μœ—μ€„μ˜ yλŠ” undefined
var y = 2; // yλ₯Ό μ„ μ–Έν•˜κ³  μ΄ˆκΈ°ν™”


// 예제 2
// ν˜Έμ΄μŠ€νŒ…μ€ μ—†μ§€λ§Œ, λ³€μˆ˜ μ΄ˆκΈ°ν™”λŠ” (아직 ν•˜μ§€ μ•Šμ€ 경우) λ³€μˆ˜ μ„ μ–ΈκΉŒμ§€ λ³‘ν–‰ν•˜λ―€λ‘œ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 있음

a = '크랜'; // a μ΄ˆκΈ°ν™”
b = '베리'; // b μ΄ˆκΈ°ν™”

console.log(a + "" + b); // '크랜베리'

 

λ‹€μŒμ€ ν•¨μˆ˜μ˜ μ˜ˆμ‹œμ΄λ‹€.

// 일반적인 μ½”λ“œ μž‘μ„± μˆœμ„œ

function catName(name) {
	console.log(`제 κ³ μ–‘μ΄μ˜ 이름은 ${name}μž…λ‹ˆλ‹€.`)
 }
 
 catName("ν˜Έλž‘μ΄");
 // "제 κ³ μ–‘μ΄μ˜ 이름은 ν˜Έλž‘μ΄μž…λ‹ˆλ‹€."
// ν˜Έμ΄μŠ€νŒ… μ˜ˆμ‹œ

catName("λ‚˜λΉ„");

function catName(name) {
	console.log(`제 κ³ μ–‘μ΄μ˜ 이름은 ${name}μž…λ‹ˆλ‹€.`);
}
// "제 κ³ μ–‘μ΄μ˜ 이름은 λ‚˜λΉ„μž…λ‹ˆλ‹€."
  • 'λ‚˜λΉ„'의 경우 ν•¨μˆ˜ 호좜이 ν•¨μˆ˜ μžμ²΄λ³΄λ‹€ λ¨Όμ € μž‘μ„±λ˜μ—ˆμŒμ—λ„ λΆˆκ΅¬ν•˜κ³ , μ •μƒμ μœΌλ‘œ console.logκ°€ 좜λ ₯λ˜λŠ” 것을 λ³Ό 수 μžˆλ‹€.

 

5) var, let const 비ꡐ 정리

 

 


참고자료

γ€Œλͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive」, 이웅λͺ¨, μœ„ν‚€λΆμŠ€

mdn web docs | 호이슀νŒ