πΈ11μ₯. μμ κ°κ³Ό κ°μ²΄μ λΉκ΅
μλ°μ€ν¬λ¦½νΈκ° μ 곡νλ 7κ°μ§ λ°μ΄ν° νμ (μ«μ, λ¬Έμμ΄, λΆλ¦¬μΈ, null, undefined, μ¬λ², κ°μ²΄ νμ )μ ν¬κ²
μμ νμ (primitive type)
κ³Όκ°μ²΄ νμ (object/reference type)
μΌλ‘ ꡬλΆν μ μλ€. (6μ₯)
β
11.1 μμ νμ
κ³Ό κ°μ²΄ νμ
μ λνμ μΈ μ°¨μ΄μ
μμ νμ μ κ°(==
μμ κ°
)μλ³κ²½ λΆκ°λ₯ν κ°
(immutable value)κ°μ²΄(μ°Έμ‘°) νμ μ κ°(==
κ°μ²΄
)μλ³κ²½ κ°λ₯ν κ°
(mutable value)μμκ°μ λ³μμ ν λΉνλ©΄
λ³μμλ μ€μ κ°μ΄ μ μ₯
λλ€.κ°μ²΄λ₯Ό λ³μμ ν λΉνλ©΄
λ³μμλ μ°Έμ‘° κ°μ΄ μ μ₯
λλ€.μμκ°μ κ°λ λ³μλ₯Ό λ€λ₯Έ λ³μμ ν λΉνλ©΄ β μμ κ°μ΄ 볡μ¬λμ΄ μ λ¬(
κ°μ μν μ λ¬. pass by value
)κ°μ²΄λ₯Ό κ°λ¦¬ν€λ λ³μλ₯Ό λ€λ₯Έ λ³μμ ν λΉνλ©΄ β μλ³Έμ μ°Έμ‘°κ°μ΄ 볡μ¬λμ΄ μ λ¬(
μ°Έμ‘°μ μν μ λ¬. pass by reference
)
β
11.2 μμ κ°
λ³κ²½ λΆκ°λ₯ν κ°
μμ κ°μ λ³κ²½ λΆκ°λ₯ν κ° == μ½κΈ° μ μ© κ°μ΄λ€.
κ°μ λ³κ²½ν μ μλ€
λ μλ―Έ μ΄ν΄λ³΄κΈ°
λ³μ
λ κ°μ μ μ₯νκΈ° μν΄ ν보ν λ©λͺ¨λ¦¬ κ³΅κ° κ·Έ μ체/λ©λͺ¨λ¦¬ 곡κ°μ μλ³νκΈ° μν μ΄λ¦μ΄κ³κ°
μ λ³μμ μ μ₯λ λ°μ΄ν°λ‘μ ννμμ΄ νκ°λμ΄ μμ±λ κ²°κ³Όλ°λΌμ, λ³κ²½ λΆκ°λ₯νλ€λ κ²μ λ³μκ° μλλΌ
κ°μ λν μ§μ
μ΄λ€.μ¦, "μμ κ°μ λ³κ²½ λΆκ°λ₯νλ€."
μμ κ° μ체λ₯Ό λ³κ²½ν μ μλ€. β O
λ³μ κ°μ λ³κ²½ν μ μλ€. β X
λΆλ³μ±μ κ°λ μμ κ°μ ν λΉν λ³μκ° λ³μ κ°μ λ³κ²½ν μ μλ λ°©λ²μ μ€μ§ "μ¬ν λΉ" λΏμ΄λ€.
μλλ score λ³μκ° μ μΈλκ³ ν λΉ λ ν κ°μ΄ λ³κ²½λλ κ³Όμ μ λν κ·Έλ¦Όμ΄λ€.
μμ κ° numberλ immutableν κ°
λ°λΌμ, scoreλ κ° 80μ 90μΌλ‘ λ³κ²½νλ κ²μ΄ μλλΌ 90μ΄λΌλ μ«μλ‘ μλ‘μ΄ λ©λͺ¨λ¦¬ 곡κ°μ ν λΉν ν λ³μκ° κ°λ¦¬ν€λ κ³΅κ° κ°μ λ°κΏμ€λ€.
λ¬Έμμ΄κ³Ό λΆλ³μ±
μλ°μ€ν¬λ¦½νΈμ λ¬Έμμ΄μ μμνμ
μ΄λ©°, λ³κ²½ λΆκ°λ₯νλ€.
λ¬Έμμ΄μ ꡬμ±λ λ¬Έμμ κ°μμ λ°λΌ νμν λ©λͺ¨λ¦¬ 곡κ°μ ν¬κΈ°κ° λ€λ₯΄λ€.
λ¬Έμμ΄μ
μ μ¬ λ°°μ΄ κ°μ²΄
μ΄λ©΄μμ΄ν°λ¬λΈ
μ΄λ€. λ°λΌμ λ°°μ΄κ³Ό μ μ¬νκ² μ κ·Όν μ μλ€.
λ¬Έμμ΄μ ν λ¬Έμλ₯Ό λ³κ²½ν΄ 보면?
var str = "string";
str[0] = "S";
console.log(str); // "string"
'string' μμ 첫 λ²μ§Έ 's' λ₯Ό 'S' λ‘ λ³κ²½νλ € νμ§λ§ str λ³μλ "λ¬Έμμ΄, μ¦ μμ κ°"
μμ κ°μ λ³κ²½ λΆκ°λ₯ν κ°(immutable value) -> κ°μ΄ μ λ°μ΄νΈ λμ§ μλλ€.
μ°Έκ³ λ‘ μλ¬λ λ°μνμ§ μλλ€.
νμ§λ§ μλμ²λΌ μ¬ν λΉμΌλ‘ κ°μ λ³κ²½νλ κ²μ κ°λ₯νλ€.
var str = "Hello";
str = "World";
console.log(str); // "World"
@μ μ¬ λ°°μ΄ κ°μ²΄
λ°°μ΄μ²λΌ μΈλ±μ€λ‘ νλ‘νΌν° κ°μ μ κ·Όν μ μκ³ , length νλ‘νΌν°λ₯Ό κ°λ κ°μ²΄
λ¬Έμμ΄ : μΈλ±μ€λ₯Ό ν΅ν΄ κ° λ¬Έμμ μ κ·Ό κ°λ₯. length νλ‘νΌν° κ°μ§. forλ¬Έ μν κ°λ₯
κ°μ μν μ λ¬(pass by value)
π λ³μμ μμ κ°μ κ°λ λ³μλ₯Ό ν λΉνλ©΄, ν λΉλ°μ λ³μμλ ν λΉλλ λ³μμ μμ κ°μ΄ 볡μ¬λμ΄ μ λ¬λλ κ²
1) λ³μμ λ³μλ₯Ό ν λΉνμ λ 무μμ΄ μ΄λ»κ² μ λ¬λ κΉ?
var score = 80;
var copy = score;
console.log(score, copy); // 80 80
console.log(copy === score); // true

copy λ³μμ μμ κ°μ κ°λ score λ³μλ₯Ό ν λΉνλ©΄, ν λΉλ°λ λ³μ(copy)μλ ν λΉλλ λ³μ(score)μ μμ κ° 80μ΄ λ³΅μ¬λμ΄ μ λ¬λλ€.
βscoreλ³μμ copy λ³μμ κ° 80μ λ€λ₯Έ λ©λͺ¨λ¦¬κ³΅κ°μ μ μ₯λ λ³κ°μ κ°μ΄λ€.
2) 1 μ΄ν score λ³μμ μλ‘μ΄ μ«μ κ° 100μ μ¬ν λΉνλ©΄ copyμ κ°μ μ΄λ»κ² λ κΉ?
score = 100;
console.log(score); // 100 (μλ³Έ κ°)
console.log(copy); // 80 (볡μ¬ν κ°)
scoreμ copy λ³μμ κ°μ λ€λ₯Έ λ©λͺ¨λ¦¬ 곡κ°μ μ μ₯λ λ³κ°μ κ°μ΄κΈ° λλ¬Έμ, score λ³μλ₯Ό λ³κ²½ν΄λ copy λ³μ κ°μλ μ΄λ ν μν₯λ μ£Όμ§ μλλ€.
κ°μ μν μ λ¬? μλ°ν λ§νλ©΄, κ°μ΄ μλ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό μ λ¬
- λ³μμλ κ°μ΄ μ λ¬λλ κ²μ΄ μλλΌ λ©λͺ¨λ¦¬ μ£Όμκ° μ λ¬λ¨
- λ³μμ κ°μ "μλ³μ"λ κ°μ΄ μλ "λ©λͺ¨λ¦¬ μ£Όμλ₯Ό κΈ°μ΅"νκ³ μμ
β ν λ³μμ μμ κ°μ κ°λ λ³μλ₯Ό ν λΉνλ©΄,
λ λ³μμ μμ κ°μΒ μλ‘ λ€λ₯Έ λ©λͺ¨λ¦¬ 곡κ°μ μ μ₯λ λ³κ°μ κ°μ΄ λμ΄, μ΄λ νμͺ½μμ μ¬ν λΉμ ν΅ν΄ κ°μ λ³κ²½νλλΌλ μλ‘ κ°μν μ μλ€λ κ²
β
11.3 κ°μ²΄
μλ°μ€ν¬λ¦½νΈ κ°μ²΄μ κ΄λ¦¬ λ°©μ
V8 μλ°μ€ν¬λ¦½νΈ μμ§μμλ νλ‘νΌν°μ μ κ·ΌνκΈ° μν΄ λμ νμ λμ
νλ ν΄λμ€
λΌλ λ°©μμ μ¬μ©νλ€.
λ³κ²½ κ°λ₯ν κ°
κ°μ²΄λ λ³κ²½ κ°λ₯ν κ°μ΄λ€.
κ°μ²΄λ₯Ό ν λΉν λ³μκ° κΈ°μ΅νλ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό ν΅ν΄ λ©λͺ¨λ¦¬ 곡κ°μ μ κ·Όνλ©΄
μ°Έμ‘° κ°
μ μ κ·Όν μ μλ€.μ°Έμ‘° κ°(reference value)
: μμ±λ κ°μ²΄κ° μ μ₯λ λ©λͺ¨λ¦¬ 곡κ°μ μ£Όμ
μ¦, κ°μ²΄λ₯Ό ν λΉν λ³μμλ μ°Έμ‘° κ°μ΄ μ μ₯λμ΄μκ³ , λ³μλ μ΄ μ°Έμ‘° κ°μ ν΅ν΄ κ°μ²΄μ μ κ·Όν μ μλ€.
κ°μ²΄λ₯Ό ν λΉν λ³μλ μ¬ν λΉ μμ΄ κ°μ²΄λ₯Ό μ§μ λ³κ²½ν μ μλ€.
μ¦, μ¬ν λΉ μμ΄
νλ‘νΌν° λμ μΆκ°
,νλ‘νΌν° κ° κ°±μ
,νλ‘νΌν° μ체 μμ
λ κ°λ₯νλ€.
var person = {
name: "Kwak",
};
// νλ‘νΌν° κ° κ°±μ
person.name = "Kim";
// νλ‘νΌν° κ° λμ μΆκ°
person.address = "Seoul";
console.log(person); // { name: 'Kim', address: 'Seoul' }
κ°μ²΄λ₯Ό ν λΉν λ³μμ μ¬ν λΉνμ§ μμκΈ° λλ¬Έμ, κ°μ²΄λ₯Ό ν λΉν λ³μμ μ°Έμ‘°κ°μ λ³κ²½λμ§ μλλ€. (μλ κ·Έλ¦Ό μ°Έκ³ )
π λ¨μ : μ¬λ¬κ°μ μλ³μκ° νλμ κ°μ²΄λ₯Ό 곡μ ν μ μλ€λ μ
μ°Έμ‘°μ μν μ λ¬(pass by reference)
π κ°μ²΄λ₯Ό κ°λ¦¬ν€λ λ³μλ₯Ό λ€λ₯Έ λ³μμ ν λΉνλ©΄ μλ³Έμ μ°Έμ‘° κ°μ΄ 볡μ¬λμ΄ μ λ¬λλ κ²
μ¬λ¬κ°μ μλ³μκ° νλμ κ°μ²΄λ₯Ό 곡μ ν μ μλ€.
var person = {
name: "Lee",
};
// μ°Έμ‘° κ°μ 볡μ¬(μμ 볡μ¬)
var copy = person;
κ°μ²΄λ₯Ό κ°λ¦¬ν€λ λ³μ(μλ³Έ, person)λ₯Ό λ€λ₯Έ λ³μ(μ¬λ³Έ, copy)μ ν λΉνλ©΄ μλ³Έμ
μ°Έμ‘° κ°μ΄ 볡μ¬λμ΄ μ λ¬
λλ€. βμ°Έμ‘°μ μν μ λ¬
μλ³Έ personκ³Ό μ¬λ³Έ copy λͺ¨λ λμΌν κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€ == λ κ°μ μλ³μκ° νλμ κ°μ²΄λ₯Ό 곡μ
μ°Έμ‘°μ μν μ λ¬?
var person = {
name: "Kwak",
};
// "μ°Έμ‘° κ°"μ 볡μ¬, copyμ personμ΄ λμΌν κ°μ²΄λ₯Ό μ°Έμ‘°νλ€.
var copy = person;
console.log(copy === person); // true
// copyλ₯Ό ν΅ν΄ κ°μ²΄μ name νλ‘νΌν°λ₯Ό λ³κ²½
copy.name = "Kim";
// personμ ν΅ν΄ κ°μ²΄μ address νλ‘νΌν°λ₯Ό λμ μμ±
person.address = "Seoul";
console.log(person); // { name: 'Kim', address: 'Seoul' }
console.log(copy); // { name: 'Kim', address: 'Seoul' }
κ²°κ΅,
κ°μ μν μ λ¬
κ³Όμ°Έμ‘°μ μν μ λ¬
μ μλ³μκ° κΈ°μ΅νλ λ©λͺ¨λ¦¬ 곡κ°μ μ μ₯λμ΄ μλ κ°μ 볡μ¬ν΄μ μ λ¬νλ€λ λ©΄μμ λμΌν¨λ¨, λ³μμ μ μ₯λμ΄ μλ κ°μ΄ μμκ°μ΄λ μ°Έμ‘°κ°μ΄λμ μ°¨μ΄κ° μμ λΏ
λ°λΌμ, μλ°μ€ν¬λ¦½νΈμλ βμ°Έμ‘°μ μν μ λ¬βμ μ‘΄μ¬νμ§ μλλ€κ³ λ§ν μ μμ
μμ λ³΅μ¬ vs κΉμ 볡μ¬
μμ 볡μ¬(shallow copy) : κ°μ²΄μ μ€μ²©λ κ°μ²΄λ μ°Έμ‘° κ°μ 볡μ¬
κΉμ 볡μ¬(deep copy) :κ°μ²΄μ μ€μ²©λ κ°μ²΄κΉμ§ μμ κ°μ²λΌ μμ ν 볡μ¬
const o = { x: { y: 1 } };
// μμ 볡μ¬
const c1 = { ...o };
console.log(c1 === o); // false
console.log(c1.x === o.x); // true
// κΉμ 볡μ¬
// lodashμ cloneDeep μ¬μ©
const c2 = _.cloneDeep(o);
console.log(c2 === o); // true
console.log(c2.x === o.x); // true
Last updated