ê°ì²´ì ìì íì ì 근본ì ì¸ ì°¨ì´ ì¤ íëë ê°ì²´ë â참조ì ìí´(by reference)â ì ì¥ëê³ ë³µì¬ëë¤ë ê²ì ëë¤.
ììê°(문ìì´, ì«ì, ë¶ë¦° ê°)ì âê° ê·¸ëë¡â ì ì¥Â·í ë¹ëê³ ë³µì¬ëë ë°ë©´ì ë§ì´ì£ .
ìì:
let message = "Hello!";
let phrase = message;
ìì를 ì¤ííë©´ ë ê°ì ë
립ë ë³ìì ê°ê° 문ìì´ "Hello!"ê° ì ì¥ë©ëë¤.
ê·¸ë°ë° ê°ì²´ì ëì ë°©ìì ì´ì ë¤ë¦ ëë¤.
ë³ìì ê°ì²´ê° ê·¸ëë¡ ì ì¥ëë ê²ì´ ìëë¼, ê°ì²´ê° ì ì¥ëì´ìë 'ë©ëª¨ë¦¬ 주ìâì¸ ê°ì²´ì ëí '참조 ê°âì´ ì ì¥ë©ëë¤.
그림ì íµí´ ë³ì userì ê°ì²´ë¥¼ í ë¹í ë ë¬´ì¨ ì¼ì´ ì¼ì´ëëì§ ììë´ ìë¤.
let user = {
name: "John"
};
ê°ì²´ë ë©ëª¨ë¦¬ ë´ ì´ëê°ì ì ì¥ëê³ , ë³ì userì ê°ì²´ë¥¼ '참조âí ì ìë ê°ì´ ì ì¥ë©ëë¤.
ë°ë¼ì ê°ì²´ê° í ë¹ë ë³ì를 ë³µì¬í ë ê°ì²´ì 참조 ê°ì´ ë³µì¬ëê³ ê°ì²´ë ë³µì¬ëì§ ììµëë¤.
ìì:
let user = { name: "John" };
let admin = user; // 참조ê°ì ë³µì¬í¨
ë³ìë ë ê°ì´ì§ë§ ê° ë³ìì ëì¼ ê°ì²´ì ëí 참조 ê°ì´ ì ì¥ëì£ .
ë°ë¼ì ê°ì²´ì ì ê·¼íê±°ë ê°ì²´ë¥¼ ì¡°ìí ë ì¬ë¬ ë³ì를 ì¬ì©í ì ììµëë¤.
let user = { name: 'John' };
let admin = user;
admin.name = 'Pete'; // 'admin' 참조 ê°ì ìí´ ë³ê²½ë¨
alert(user.name); // 'Pete'ê° ì¶ë ¥ë¨. 'user' 참조 ê°ì ì´ì©í´ ë³ê²½ì¬íì íì¸í¨
ê°ì²´ë¥¼ ìëì¥ì ë¹ì íë©´ ë³ìë ìëì¥ì ì´ ì ìë ì´ì ë¼ê³ í ì ììµëë¤. ìëì¥ì íë, ìëì¥ì ì´ ì ìë ì´ì ë ë ê°ì¸ë°, ê·¸ì¤ íë(admin)를 ì¬ì©í´ ìëì¥ì ì´ì´ ì ëí í, ë ë¤ë¥¸ ì´ì ë¡ ìëì¥ì ì´ë©´ ì ëë ë´ì©ì ë³¼ ì ììµëë¤.
참조ì ìí ë¹êµ
ê°ì²´ ë¹êµ ì ëë± ì°ì°ì ==ì ì¼ì¹ ì°ì°ì ===ë ëì¼íê² ëìí©ëë¤.
ë¹êµ ì í¼ì°ì°ìì¸ ë ê°ì²´ê° ëì¼í ê°ì²´ì¸ ê²½ì°ì ì°¸ì ë°ííì£ .
ë ë³ìê° ê°ì ê°ì²´ë¥¼ 참조íë ìì를 ì´í´ë´ ìë¤. ì¼ì¹Â·ëë± ë¹êµ 모ëìì ì°¸ì´ ë°íë©ëë¤.
let a = {};
let b = a; // 참조ì ìí ë³µì¬
alert( a == b ); // true, ë ë³ìë ê°ì ê°ì²´ë¥¼ 참조í©ëë¤.
alert( a === b ); // true
ë¤ë¥¸ ìì를 ì´í´ë´ ìë¤. ë ê°ì²´ 모ë ë¹ì´ìë¤ë ì ìì ê°ì ë³´ì´ì§ë§, ë 립ë ê°ì²´ì´ê¸° ë문ì ì¼ì¹Â·ëë± ë¹êµíë©´ ê±°ì§ì´ ë°íë©ëë¤.
let a = {};
let b = {}; // ë
립ë ë ê°ì²´
alert( a == b ); // false
obj1 > obj2 ê°ì ëì ë¹êµë obj == 5 ê°ì ììê°ê³¼ì ë¹êµìì ê°ì²´ê° ììíì¼ë¡ ë³íë©ëë¤. ê°ì²´ê° ì´ë»ê² ììíì¼ë¡ ë³íëì§ì ëí´ì ê³§ íìµí ìì ì¸ë°, ì´ë¬í ë¹êµ(ê°ì²´ë¼ë¦¬ì ëì ë¹êµë ììê°ê³¼ ê°ì²´ë¥¼ ë¹êµíë ê²)ê° íìí ê²½ì°ë ë§¤ì° ë물긴 í©ëë¤. ëê° ì½ë© ì¤ì ë문ì ì´ë° ë¹êµê° ë°ìí©ëë¤.
ê°ì²´ ë³µì¬, ë³í©ê³¼ Object.assign
ê°ì²´ê° í ë¹ë ë³ì를 ë³µì¬íë©´ ëì¼í ê°ì²´ì ëí 참조 ê°ì´ íë ë ë§ë¤ì´ì§ë¤ë 걸 ë°°ì ìµëë¤.
ê·¸ë°ë° ê°ì²´ë¥¼ ë³µì íê³ ì¶ë¤ë©´ ì´ë»ê² í´ì¼ í ê¹ì? 기존ì ìë ê°ì²´ì ëê°ì¼ë©´ì ë 립ì ì¸ ê°ì²´ë¥¼ ë§ë¤ê³ ì¶ë¤ë©´ ë§ì´ì£ .
ë°©ë²ì ìëë° ìë°ì¤í¬ë¦½í¸ë ê°ì²´ ë³µì ë´ì¥ ë©ìë를 ì§ìíì§ ì기 ë문ì ì¡°ê¸ ì´ë µìµëë¤. ì¬ì¤ ê°ì²´ë¥¼ ë³µì í´ì¼ í ì¼ì ê±°ì ììµëë¤. 참조ì ìí ë³µì¬ë¡ í´ê²° ê°ë¥í ì¼ì´ ëë¤ìì´ì£ .
ì ë§ ë³µì ê° íìí ìí©ì´ë¼ë©´ ìë¡ì´ ê°ì²´ë¥¼ ë§ë ë¤ì 기존 ê°ì²´ì íë¡í¼í°ë¤ì ìíí´ ìì ìì¤ê¹ì§ íë¡í¼í°ë¥¼ ë³µì¬íë©´ ë©ëë¤.
ìëì ê°ì´ ë§ì´ì£ .
let user = {
name: "John",
age: 30
};
let clone = {}; // ìë¡ì´ ë¹ ê°ì²´
// ë¹ ê°ì²´ì user íë¡í¼í° ì ë¶ë¥¼ ë³µì¬í´ ë£ìµëë¤.
for (let key in user) {
clone[key] = user[key];
}
// ì´ì cloneì ìì í ë
립ì ì¸ ë³µì ë³¸ì´ ëììµëë¤.
clone.name = "Pete"; // cloneì ë°ì´í°ë¥¼ ë³ê²½í©ëë¤.
alert( user.name ); // 기존 ê°ì²´ìë ì¬ì í Johnì´ ììµëë¤.
Object.assign를 ì¬ì©íë ë°©ë²ë ììµëë¤.
문ë²ê³¼ ëì ë°©ìì ë¤ìê³¼ ê°ìµëë¤.
Object.assign(dest, [src1, src2, src3...])
- 첫 ë²ì§¸ ì¸ì
destë 목íë¡ íë ê°ì²´ì ëë¤. - ì´ì´ì§ë ì¸ì
src1, ..., srcNë ë³µì¬íê³ ì íë ê°ì²´ì ëë¤....ì íìì ë°ë¼ ì¼ë§ë ì§ ë§ì ê°ì²´ë¥¼ ì¸ìë¡ ì¬ì©í ì ìë¤ë ê²ì ëíë ëë¤. - ê°ì²´
src1, ..., srcNì íë¡í¼í°ë¥¼destì ë³µì¬í©ëë¤.dest를 ì ì¸í ì¸ì(ê°ì²´)ì íë¡í¼í° ì ë¶ê° 첫 ë²ì§¸ ì¸ì(ê°ì²´)ë¡ ë³µì¬ë©ëë¤. - ë§ì§ë§ì¼ë¡
dest를 ë°íí©ëë¤.
assign ë©ìë를 ì¬ì©í´ ì¬ë¬ ê°ì²´ë¥¼ íëë¡ ë³í©íë ìì를 ì´í´ë´
ìë¤.
let user = { name: "John" };
let permissions1 = { canView: true };
let permissions2 = { canEdit: true };
// permissions1ê³¼ permissions2ì íë¡í¼í°ë¥¼ userë¡ ë³µì¬í©ëë¤.
Object.assign(user, permissions1, permissions2);
// now user = { name: "John", canView: true, canEdit: true }
목í ê°ì²´(user)ì ëì¼í ì´ë¦ì ê°ì§ íë¡í¼í°ê° ìë ê²½ì°ì 기존 ê°ì´ ë®ì´ìì ì§ëë¤.
let user = { name: "John" };
Object.assign(user, { name: "Pete" });
alert(user.name); // user = { name: "Pete" }
Object.assignì ì¬ì©íë©´ ë°ë³µë¬¸ ìì´ë ê°ë¨íê² ê°ì²´ë¥¼ ë³µì¬í ì ììµëë¤.
let user = {
name: "John",
age: 30
};
let clone = Object.assign({}, user);
ìì를 ì¤ííë©´ userì ìë 모ë íë¡í¼í°ê° ë¹ ë°°ì´ì ë³µì¬ëê³ ë³ìì í ë¹ë©ëë¤.
ì¤ì²© ê°ì²´ ë³µì¬
ì§ê¸ê¹ì§ userì 모ë íë¡í¼í°ê° ììê°ì¸ ê²½ì°ë§ ê°ì íìµëë¤. ê·¸ë°ë° íë¡í¼í°ë ë¤ë¥¸ ê°ì²´ì ëí 참조 ê°ì¼ ìë ììµëë¤. ì´ ê²½ì°ë ì´ë»ê² í´ì¼ í ê¹ì?
ìëì ê°ì´ ë§ì´ì£ .
let user = {
name: "John",
sizes: {
height: 182,
width: 50
}
};
alert( user.sizes.height ); // 182
clone.sizes = user.sizesë¡ íë¡í¼í°ë¥¼ ë³µì¬íë ê²ë§ì¼ë¡ ê°ì²´ë¥¼ ë³µì í ì ììµëë¤. user.sizesë ê°ì²´ì´ê¸° ë문ì 참조 ê°ì´ ë³µì¬ë기 ë문ì
ëë¤. clone.sizes = user.sizesë¡ íë¡í¼í°ë¥¼ ë³µì¬íë©´ cloneê³¼ userë ê°ì sizes를 ê³µì íê² ë©ëë¤.
ìëì ê°ì´ ë§ì´ì£ .
let user = {
name: "John",
sizes: {
height: 182,
width: 50
}
};
let clone = Object.assign({}, user);
alert( user.sizes === clone.sizes ); // true, ê°ì ê°ì²´ì
ëë¤.
// userì cloneë sizes를 ê³µì í©ëë¤.
user.sizes.width++; // í ê°ì²´ìì íë¡í¼í°ë¥¼ ë³ê²½í©ëë¤.
alert(clone.sizes.width); // 51, ë¤ë¥¸ ê°ì²´ìì ë³ê²½ ì¬íì íì¸í ì ììµëë¤.
ì´ ë¬¸ì 를 í´ê²°íë ¤ë©´ user[key]ì ê° ê°ì ê²ì¬íë©´ì, ê·¸ ê°ì´ ê°ì²´ì¸ ê²½ì° ê°ì²´ì 구조ë ë³µì¬í´ì£¼ë ë°ë³µë¬¸ì ì¬ì©í´ì¼ í©ëë¤. ì´ë° ë°©ìì 'ê¹ì ë³µì¬(deep cloning)'ë¼ê³ í©ëë¤.
ê¹ì ë³µì¬ ì ì¬ì©ëë íì¤ ìê³ ë¦¬ì¦ì¸ Structured cloning algorithmì ì¬ì©íë©´ ì ì¬ë¡ë¥¼ ë¹ë¡¯í ë¤ìí ìí©ìì ê°ì²´ë¥¼ ë³µì í ì ììµëë¤.
ìë°ì¤í¬ë¦½í¸ ë¼ì´ë¸ë¬ë¦¬ lodashì ë©ìëì¸ _.cloneDeep(obj)ì ì¬ì©íë©´ ì´ ìê³ ë¦¬ì¦ì ì§ì 구ííì§ ìê³ ë ê¹ì ë³µì¬ë¥¼ ì²ë¦¬í ì ìì¼ë¯ë¡ ì°¸ê³ íì기 ë°ëëë¤.
ìì½
ê°ì²´ë 참조ì ìí´ í ë¹ëê³ ë³µì¬ë©ëë¤. ë³ìì âê°ì²´â ìì²´ê° ìë ë©ëª¨ë¦¬ìì 주ìì¸ '참조âê° ì ì¥ë©ëë¤. ë°ë¼ì ê°ì²´ê° í ë¹ë ë³ì를 ë³µì¬íê±°ë í¨ìì ì¸ìë¡ ë길 ë ê°ì²´ê° ìë ê°ì²´ì ì°¸ì¡°ê° ë³µì¬ë©ëë¤.
ê·¸ë¦¬ê³ ë³µì¬ë 참조를 ì´ì©í 모ë ìì (íë¡í¼í° ì¶ê°Â·ìì ë±)ì ëì¼í ê°ì²´ë¥¼ ëìì¼ë¡ ì´ë¤ì§ëë¤.
ê°ì²´ì 'ì§ì§ ë³µì¬ë³¸âì ë§ë¤ë ¤ë©´ 'ìì ë³µì¬(shallow copy)'를 ê°ë¥íê² í´ì£¼ë Object.assignì´ë 'ê¹ì ë³µì¬â를 ê°ë¥íê² í´ì£¼ë _.cloneDeep(obj)를 ì¬ì©íë©´ ë©ëë¤. ì´ë ìì ë³µì¬ë³¸ì ì¤ì²© ê°ì²´ë¥¼ ì²ë¦¬íì§ ëª»íë¤ë ì ì 기ìµí´ ëì기 ë°ëëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.