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" λ²νΌμ ν΄λ¦νμ¬ μλ € μ£Όμμμ€.
μλ°μ€ν¬λ¦½νΈμμ ν΄λ‘μ μ λν κ²μλ¬Όμ κ΄μ¬μ΄μμ μλ μμ΅λλ€.