Value Types, Reference Types and Scope in JavaScript - Lee-hyuna/33-js-concepts-kr GitHub Wiki

μžλ°”μŠ€ν¬λ¦½νŠΈ κ°’ μœ ν˜•, μ°Έμ‘° μœ ν˜• 및 λ²”μœ„

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κ°„λ‹¨ν•œ 기둝으둜 μ‹œμž‘ν•˜λŠ” μ‹œλ¦¬μ¦ˆμ˜ 두 번째 νŒŒνŠΈμž…λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—λŠ” 객체와 ν•¨μˆ˜λΌλŠ” 두 가지 κΈ°λ³Έ μš”μ†Œ 만 μžˆμŠ΅λ‹ˆλ‹€.

객체와 ν•¨μˆ˜λ₯Ό μ΄ν•΄ν•˜κ³  μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ΄ν•΄ν•©λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€. 사싀, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  것은 κ°μ²΄μž…λ‹ˆλ‹€.

κ·Έλ ‡μ§€λ§Œ μ–Έμ–΄λŠ” λ‹€λ₯Έ 의미λ₯Ό 가지고 μžˆλŠ” κ°’ μœ ν˜•μœΌλ‘œ μ•Œλ €μ§„ νŠΉμ •ν•œ μœ ν˜• μ΅œμ ν™”λ₯Ό ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μ„±λŠ₯(performance)κ³Ό μ‚¬λžŒλ“€μ΄ κ°’ μœ ν˜•μ΄ νŠΉμ •ν•œ λ°©λ²•μœΌλ‘œ μž‘λ™ν• κ²ƒμ΄λΌκ³  μ§κ΄€μ μœΌλ‘œ κΈ°λŒ€ν•˜κ³  있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

κ°’ μœ ν˜•μ€ number, symbol, boolean, null 그리고 undefinedμž…λ‹ˆλ‹€. string도 λ©”λͺ¨λ¦¬λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ μ•½κ°„ λ‹€λ₯Έ λ™μž‘μœΌλ‘œ κ΅¬ν˜„λ˜μ§€λ§Œ κ°’ μœ ν˜•μž…λ‹ˆλ‹€.

symbolκ³Ό λ³„κ°œλ‘œ 이듀은 λͺ¨λ‘ λ¬Έλ²•μ μœΌλ‘œ ν†΅μš©λ©λ‹ˆλ‹€. 즉, 문자 κ·ΈλŒ€λ‘œ ν”„λ‘œκ·Έλž¨μ— μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€.

var a = 1; // λ¦¬ν„°λŸ΄ κ°’ 1은 'a'라고 ν‘œμ‹œλœ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ‘œ λ³΅μ‚¬λ©λ‹ˆλ‹€.

κ°’ μœ ν˜•μ—λŠ” 볡사 μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€.

var a = 1;
var b = a;
a = 2;
b === 1; // true: κ°’ 1은 b 뒀에 μžˆλŠ” λ©”λͺ¨λ¦¬μ— λ³΅μ‚¬λ©λ‹ˆλ‹€.

μ •ν™•ν•˜κ²Œ μš°λ¦¬κ°€ κΈ°λŒ€ν•˜λŠ” ν–‰λ™μž…λ‹ˆλ‹€(그리고 이것이 λ°”λ‘œ μ΄λŸ°μ‹μœΌλ‘œ ν–‰λ™ν•˜λŠ” μ΄μœ μž…λ‹ˆλ‹€).
boolean도 λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€.

μ—¬κΈ° ν¬μŠ€νŠΈμž‡μ— κ·Έλ¦° 것은 μ½”λ“œλ₯Ό μ‹€ν–‰ ν•œ ν›„ λ‚˜νƒ€λ‚˜λŠ” λ ‰μ‹œμ»¬ ν™˜κ²½μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ, 두 가지 λ³€μˆ˜κ°€ μ–΄νœ˜ ν™˜κ²½μ— μΆ”κ°€λ©λ‹ˆλ‹€. a와 b. 이듀 값은 λ ‰μ‹œμ»¬ ν™˜κ²½μ—μ„œ key - value - pair mapping 으둜 μ €μž₯λ©λ‹ˆλ‹€.
β€œLexical environment(λ ‰μ‹œμ»¬ ν™˜κ²½)”은 μž‘μ„±λœ μ½”λ“œμ˜ κ΄€μ μ—μ„œ λ‘˜λŸ¬μ‹Ό λ²”μœ„λ‘œ μ •μ˜ 된 μ»¨ν…μŠ€νŠΈλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

null 및 undefinedλŠ” 빈 값을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€. null은 μœ μ €κ°€ μ •μ˜ν•œ 무언가가 μ˜λ„μ μœΌλ‘œ λΉ„μ–΄μžˆμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. undefinedλŠ” 아무것도 μ—†λŠ” 것을 λ‚˜νƒ€λ‚΄λŠ” νŠΉλ³„ν•œ κ°’μž…λ‹ˆλ‹€.
null은 λͺ¨λ“  객체 상속 체인의 맨 μœ„μ—λ„ μ‚¬μš©λ©λ‹ˆλ‹€.

λ³€μˆ˜κ°€ μ„ μ–Έλ˜κ³  μ΄ˆκΈ°ν™”λ˜μ§€ μ•ŠμœΌλ©΄ 값은 undefinedμž…λ‹ˆλ‹€.
λ¬Έμžμ—΄μ€ λ¬Έμžμ—΄κ³Ό κ΄€λ ¨λœ 고유 ν•œ λ©”λͺ¨λ¦¬ 문제 λ•Œλ¬Έμ— 특수 κ°’ μœ ν˜•μž…λ‹ˆλ‹€.(μ›ν•˜λŠ” 만큼 κΈΈμ–΄μ§ˆ 수 있음!)
λ¬Έμžμ—΄μ€ κ°’ μœ ν˜•μœΌλ‘œ 생각할 수 μžˆμ§€λ§Œ λ―Έλ¬˜ν•œ μ°¨μ΄λŠ” 할당이 전체 값을 λ³΅μ‚¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λŒ€μ‹  κ΅¬ν˜„μ€ λ¬Έμžμ—΄μ˜ 단일 ν‘œν˜„μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό λ³΅μ‚¬ν•©λ‹ˆλ‹€.

λ‚΄λΆ€μ μœΌλ‘œ μœ μ§€λ©λ‹ˆλ‹€.
κ°μ²΄λŠ” μ°Έμ‘° μœ ν˜•μž…λ‹ˆλ‹€. κ°μ²΄λŠ” μ°Έμ‘° 값을 λ³΅μ‚¬ν•©λ‹ˆλ‹€.
κ°μ²΄λŠ” 두 가지 λ°©λ²•μœΌλ‘œ μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.

var o = new Object();
var o = {};

μœ„μ˜ 두 κ°€μ§€λŠ” λ™λ“±ν•©λ‹ˆλ‹€. ν›„μžλ₯Ό 객체 λ¦¬ν„°λŸ΄ ꡬ문이라고 ν•©λ‹ˆλ‹€.

객체λ₯Ό μ°Έμ‘°ν•˜λŠ” 것은 객체 자체 λŒ€μ‹ μ— κ·Έ 주변을 μ ‘κ·Όν•œλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. 이것은 μ„±λŠ₯의 이유 외에도 λŒ€λΆ€λΆ„μ˜ κ°œλ°œμžκ°€ κΈ°λŒ€ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

λ‚˜λŠ” λͺ¨λ“ κ²ƒμ΄ κ°μ²΄λΌλŠ” 것을 μ•žμ„œ μ–ΈκΈ‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
이것은 auto-boxingμ΄λΌλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μžλ™ κΈ°λŠ₯에 μ˜ν•΄ ν™œμ„±ν™”λ˜λŠ” κ°œλ…μ  κ·œμΉ™μž…λ‹ˆλ‹€.

auto-boxing은 객체처럼 μ·¨κΈ‰ 될 λ•Œ 객체의 κ°’ μœ ν˜•μ€ boxing λ˜λŠ” wrappingμž…λ‹ˆλ‹€. κ·Έ λ’€μ—μ„œλŠ” κ°’ μœ ν˜• μΈμŠ€ν„΄μŠ€μ˜ μ‚¬μš© κΈ°κ°„ λ™μ•ˆ μž„μ‹œ 객체가 μž‘μ„±λ©λ‹ˆλ‹€.

예λ₯Ό λ“€λ©΄:

2.0.toString(); 2.0은 μžλ™μœΌλ‘œ boxingλ˜μ–΄ toString λ©”μ„œλ“œλ₯Ό 호좜 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.  (boxing or unboxing)이 있음

이와 같이 κ°’ μœ ν˜•μ„ ν¬ν•¨ν•˜μ—¬ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  것이 객체라고 말할 수 μžˆμŠ΅λ‹ˆλ‹€ (아무 κ²ƒλ„μ—†λŠ” μœ ν˜•μ€ μ œμ™Έ). μ–΄λ–€ μ‚¬λžŒλ“€μ€ μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ 객체 지ν–₯적이지 μ•Šλ‹€κ³  λ§ν•œλ‹€. λ°˜λŒ€λ‘œ, μš°λ¦¬κ°€ λ³΄μ•˜λ“―μ΄, μ–Έμ–΄μ˜ λͺ¨λ“  것은 문자 κ·ΈλŒ€λ‘œ λŒ€μƒμž…λ‹ˆλ‹€.

λ‹€λ₯Έ μ€‘μš”ν•œ 객체 μΉ΄ν…Œκ³ λ¦¬λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 ν•¨μˆ˜λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€.

function functionName() {  // This is a "function declaration".
  // Do something…
}

ν•¨μˆ˜λ₯Ό ν‘œν˜„μ‹ (ν•¨μˆ˜ ν‘œν˜„μ‹)으둜 μ •μ˜ ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

var x = function() {};

Aside : μœ„ ν‘œν˜„μ‹μ€ 기술적으둜 ν• λ‹Ή 식에 ν•¨μˆ˜ ν‘œν˜„μ‹μ΄ ν¬ν•¨λœ ν‘œν˜„μ‹ λ¬Έμž…λ‹ˆλ‹€. λ˜ν•œ ν•¨μˆ˜λ¬Έμ—λŠ” μ΄μƒν•œ κ²½μš°κ°€ μžˆλ‹€. 이듀은 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 블둝 λ‚΄λΆ€μ—μ„œ μ„ μ–Έ 된 ν•¨μˆ˜λ‘œ μ •μ˜λ©λ‹ˆλ‹€. 이듀은 ν‘œμ€€μ—μ„œ μ§€μ›λ˜μ§€ μ•Šμ•˜μ§€λ§Œ λΈŒλΌμš°μ € 곡급 μ—…μ²΄λŠ” μ—­μ‚¬μ μœΌλ‘œ ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” κ΅¬ν˜„μ„ ν–ˆμŠ΅λ‹ˆλ‹€.

if(true) {
  function f() { // A function statement.
   // Do something…
  }
}

μ΄λŸ¬ν•œ 이유둜 ν•¨μˆ˜ 문은 ES5 μ΄ν•˜μ—μ„œ μ‚¬μš©ν•΄μ„œλŠ” μ•ˆλ©λ‹ˆλ‹€.
μ°Έκ³  : ES6은 ν•¨μˆ˜ λͺ…령문에 λŒ€ν•œ ν‘œμ€€ λ™μž‘μ„ μ •μ˜ν•©λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€μ΄ λ¬Έμ„œμ˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚©λ‹ˆλ‹€.

ν•¨μˆ˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€ (κΈ°μ–΅ν•˜μ„Έμš”, λͺ¨λ“  것은 κ°μ²΄μž…λ‹ˆλ‹€). 이것은 ν•¨μˆ˜μ—μ„œ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜κ³  ν•¨μˆ˜λ‘œ 인수둜 전달할 수 μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ κΈ°λŠ₯은 β€˜first-class language citizens’이라고 ν•©λ‹ˆλ‹€.

ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 것은 (1) μž₯λ©΄ 뒀에 μžˆλŠ” ν•¨μˆ˜ 객체의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒˆλ‘œ λ§Œλ“œλŠ” κ²ƒμœΌλ‘œ 생각할 수 μžˆμŠ΅λ‹ˆλ‹€.

var f = new Function('console.log("foo");');

(1) μž…λ¬Έμ„œμ˜ 경우 μ„€λͺ…적 λͺ©μ . ν˜„μ‹€μ—λŠ” 차이가 μžˆλ‹€.

μ—¬λ‹΄μœΌλ‘œ, 이미 μ•½κ°„μ˜ μ§€μ‹μ΄μžˆλŠ” μ‚¬λžŒλ“€μ„ μœ„ν•΄, μƒˆλ‘œμš΄ ν•¨μˆ˜λŠ” μ „μ—­ λ²”μœ„μ—μ„œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. Eval은 둜컬 λ²”μœ„λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. setTimeout은 λ‚œλ… ν™” 된(obfuscated) ν•¨μˆ˜ μΈμŠ€ν„΄μŠ€μž…λ‹ˆλ‹€.

ν•¨μˆ˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ²”μœ„λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

if(true) {
  var x = 1;
}
console.log(x); // 1 because functions define scope!

μœ„μ˜ λ‚΄μš©μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

var x;
if(true) {
  x = 1;
}
console.log(x);

EcmaScript 6μ—λŠ” 블둝 λ²”μœ„ 지정이 μžˆλŠ” μΆ”κ°€ λ³€μˆ˜ μœ ν˜•μΈ let 및 constκ°€ μžˆμŠ΅λ‹ˆλ‹€.

if(true) {
  let x = 1;
  const y = 2;
}
console.log(x); // xκ°€ ifλ¬Έ λΈ”λ‘μœΌλ‘œ μŠ€μ½”ν”„ λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ— ReferenceErrorμž…λ‹ˆλ‹€.
console.log(y); // yκ°€ ifλ¬Έ λΈ”λ‘μœΌλ‘œ μŠ€μ½”ν”„ λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ— ReferenceErrorμž…λ‹ˆλ‹€.

λ²”μœ„(Scope)λŠ” λ³€μˆ˜ μ΄λ¦„μ˜ μž¬μ‚¬μš©μ„ μ œμ–΄ν•˜κ³  garbage collectorμ—μ„œ 무언가가 도달 ν•  μˆ˜μ—†κ³  μˆ˜μ§‘ ν•  μˆ˜μžˆλŠ”μ‹œκΈ°λ₯Ό κ²°μ •ν•˜λŠ” 데 μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ— μ΄ν•΄ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

Summary (μš”μ•½)

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 객체와 ν•¨μˆ˜μ— λŒ€ν•΄ 두 가지 μ€‘μš”ν•œ κ°œλ…λ§Œ 가지고 μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“  것은 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 객체이며 이것은 객체 지ν–₯ μ–Έμ–΄μž…λ‹ˆλ‹€.

κ°’ μœ ν˜•μ€ 숫자, boolean 및 λ¬Έμžμ—΄μ— λŒ€ν•΄ 더 λ‚˜μ€ μ„±λŠ₯κ³Ό 덜 λ†€λΌμš΄ 의미λ₯Ό κ°€λŠ₯ν•˜κ²Œν•˜λŠ” μ΅œμ ν™”μž…λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ²”μœ„λŠ” ν•¨μˆ˜μ— μ˜ν•΄ μ •μ˜λ˜μ§€λ§Œ λ‹€κ°€μ˜€λŠ” Ecmascript 6μ—μ„œ 블둝(block)은 νŠΉμ • μœ ν˜•μ˜ λ³€μˆ˜ 선언에 λŒ€ν•œ λ²”μœ„ 지정을 μ œκ³΅ν•©λ‹ˆλ‹€.

이 μ‹œλ¦¬μ¦ˆλŠ” μ‚¬μš©μž μ •μ˜ μœ ν˜• 및 μžλ°”μŠ€ν¬λ¦½νŠΈ ν˜Έμ΄μŠ€νŒ…μ„ κ³„μ†ν•©λ‹ˆλ‹€.

λ‚΄ 이름은 Ben Aston이며 였늘 λ‚΄ κ²Œμ‹œλ¬Όμ„ 읽어 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. μ €λŠ” λŸ°λ˜μ— 본사λ₯Ό λ‘” μžλ°”μŠ€ν¬λ¦½νŠΈ μ»¨μ„€ν„΄νŠΈλ‘œμ„œ μ „μ„Έκ³„μ—μ„œ 단기 μ»¨μ„€νŒ…μ„ μ œκ³΅ν•©λ‹ˆλ‹€. [email protected]에 연락 ν•  μˆ˜μžˆμŠ΅λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ— λŒ€ν•œ 지식을 더 λ°œμ „μ‹œν‚€κ³  μ‹Άλ‹€λ©΄, λ‚΄ μ‹€μŠ΅ 과정에 관심을 κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ 온라인으둜 www.learnjavascript.londonμ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

이 μž‘ν’ˆμ„ 즐기신 뢄은 μ•„λž˜μ˜ "recommend" λ²„νŠΌμ„ ν΄λ¦­ν•˜μ—¬ μ•Œλ € μ£Όμ‹­μ‹œμ˜€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν΄λ‘œμ €μ— λŒ€ν•œ κ²Œμ‹œλ¬Όμ— κ΄€μ‹¬μ΄μžˆμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

⚠️ **GitHub.com Fallback** ⚠️