ìë°ì¤í¬ë¦½í¸ë ê°ì²´ íë¡í¼í° í¤ë¡ ì¤ì§ 문ìíê³¼ ì¬ë³¼íë§ì íì©í©ëë¤. ì«ìí, ë¶ë¦°í 모ë ë¶ê°ë¥íê³ ì¤ì§ 문ìíê³¼ ì¬ë³¼íë§ ê°ë¥íì£ .
ì§ê¸ê¹ì§ë íë¡í¼í° í¤ê° 문ìíì¸ ê²½ì°ë§ ì´í´ë³´ììµëë¤. ì´ë² ì±í°ìì íë¡í¼í° í¤ë¡ ì¬ë³¼ê°ì ì¬ì©í´ ë³´ë©´ì, ì¬ë³¼í í¤ë¥¼ ì¬ì©í ëì ì´ì ì ëí´ ì´í´ë³´ëë¡ íê² ìµëë¤.
ì¬ë³¼
'ì¬ë³¼(symbol)'ì ì ì¼í ìë³ì(unique identifier)를 ë§ë¤ê³ ì¶ì ë ì¬ì©í©ëë¤.
Symbol()ì ì¬ì©íë©´ ì¬ë³¼ê°ì ë§ë¤ ì ììµëë¤.
// idë ìë¡ì´ ì¬ë³¼ì´ ë©ëë¤.
let id = Symbol();
ì¬ë³¼ì ë§ë¤ ë ì¬ë³¼ ì´ë¦ì´ë¼ ë¶ë¦¬ë ì¤ëª ì ë¶ì¼ ìë ììµëë¤. ì¬ë³¼ ì´ë¦ì ëë²ê¹ ì ì주 ì ì©í©ëë¤.
// ì¬ë³¼ idìë "id"ë¼ë ì¤ëª
ì´ ë¶ìµëë¤.
let id = Symbol("id");
ì¬ë³¼ì ì ì¼ì±ì´ ë³´ì¥ëë ìë£íì´ê¸° ë문ì, ì¤ëª ì´ ëì¼í ì¬ë³¼ì ì¬ë¬ ê° ë§ë¤ì´ë ê° ì¬ë³¼ê°ì ë¤ë¦ ëë¤. ì¬ë³¼ì ë¶ì´ë ì¤ëª (ì¬ë³¼ ì´ë¦)ì ì´ë¤ ê²ìë ìí¥ì ì£¼ì§ ìë ì´ë¦í ìí ë§ì í©ëë¤.
ì¤ëª
ì´ ê°ì ì¬ë³¼ ë ê°ë¥¼ ë§ë¤ê³ ì´ë¥¼ ë¹êµí´ë³´ê² ìµëë¤. ëì¼ ì°ì°ì(==)ë¡ ë¹êµ ì falseê° ë°íëë ê²ì íì¸í ì ììµëë¤.
let id1 = Symbol("id");
let id2 = Symbol("id");
alert(id1 == id2); // false
ì°¸ê³ ë¡ Ruby ë±ì ì¸ì´ììë 'ì¬ë³¼âê³¼ ì ì¬í ê°ë ì ì¬ì©íëë°, ìë°ì¤í¬ë¦½í¸ì ì¬ë³¼ì ì´ë¤ ì¸ì´ì ì°ì´ë ì¬ë³¼ê³¼ë ë¤ë¥´ê¸° ë문ì í¼ëíì§ ë§ì길 ë°ëëë¤.
ìë°ì¤í¬ë¦½í¸ìì 문ìíì¼ë¡ì ììì í ë³íì´ ë¹êµì ìì ë¡ê² ì¼ì´ëë í¸ì
ëë¤. alert í¨ìê° ê±°ì 모ë ê°ì ì¸ìë¡ ë°ì ì ìë ì´ì ê° ì´ ë문ì´ì£ . ê·¸ë¬ë ì¬ë³¼ì ìì¸ì
ëë¤. ì¬ë³¼í ê°ì ë¤ë¥¸ ìë£íì¼ë¡ ììì í ë³í(ìë í ë³í)ëì§ ììµëë¤.
ìë ìììì alertë ìë¬ë¥¼ ë°ììíµëë¤.
let id = Symbol("id");
alert(id); // TypeError: Cannot convert a Symbol value to a string
문ìì´ê³¼ ì¬ë³¼ì ê·¼ë³¸ì´ ë¤ë¥´ê¸° ë문ì ì°ì°íë¼ë ìë¡ì íì ì¼ë¡ ë³íë¼ì ì ë©ëë¤. ìë°ì¤í¬ë¦½í¸ìì 'ì¸ì´ ì°¨ìì ë³´í¸ì¥ì¹(language guard)'를 ë§ë ¨í´ ì¬ë³¼íì´ ë¤ë¥¸ íì¼ë¡ ë³íëì§ ìê² ë§ìì¤ëë¤.
ì¬ë³¼ì ë°ëì ì¶ë ¥í´ì¤ì¼ íë ìí©ì´ë¼ë©´ ìëì ê°ì´ .toString() ë©ìë를 ëª
ìì ì¼ë¡ í¸ì¶í´ì£¼ë©´ ë©ëë¤.
let id = Symbol("id");
alert(id.toString()); // Symbol(id)ê° ì¼ë¿ ì°½ì ì¶ë ¥ë¨
symbol.description íë¡í¼í°ë¥¼ ì´ì©íë©´ ì¤ëª
ë§ ë³´ì¬ì£¼ë ê²ë ê°ë¥í©ëë¤.
let id = Symbol("id");
alert(id.description); // id
âì¨ê¹â íë¡í¼í°
ì¬ë³¼ì ì´ì©íë©´ âì¨ê¹(hidden)â íë¡í¼í°ë¥¼ ë§ë¤ ì ììµëë¤. ì¨ê¹ íë¡í¼í°ë ì¸ë¶ ì½ëìì ì ê·¼ì´ ë¶ê°ë¥íê³ ê°ë ë®ì´ì¸ ì ìë íë¡í¼í°ì ëë¤.
ìëíí° ì½ëìì ê°ì§ê³ ì¨ userë¼ë ê°ì²´ê° ì¬ë¬ ê° ìê³ , user를 ì´ì©í´ ì´ë¤ ìì
ì í´ì¼ íë ìí©ì´ë¼ê³ ê°ì í´ ë´
ìë¤. userì ìë³ì를 ë¶ì¬ì£¼ëë¡ í©ìë¤.
ìë³ìë ì¬ë³¼ì ì´ì©í´ ë§ë¤ëë¡ íê² ìµëë¤.
let user = { // ìëíí° ì½ëìì ê°ì ¸ì¨ ê°ì²´
name: "John"
};
let id = Symbol("id");
user[id] = 1;
alert( user[id] ); // ì¬ë³¼ì í¤ë¡ ì¬ì©í´ ë°ì´í°ì ì ê·¼í ì ììµëë¤.
ê·¸ë°ë° 문ìì´ "id"를 í¤ë¡ ì¬ì©í´ë ëëë° Symbol("id")ì ì¬ì©í ì´ì ê° ë¬´ìì¼ê¹ì?
userë ìëíí° ì½ëìì ê°ì§ê³ ì¨ ê°ì²´ì´ë¯ë¡ í¨ë¶ë¡ ìë¡ì´ íë¡í¼í°ë¥¼ ì¶ê°í ì ììµëë¤. ê·¸ë°ë° ì¬ë³¼ì ìëíí° ì½ëìì ì ê·¼í ì ì기 ë문ì, ì¬ë³¼ì ì¬ì©íë©´ ìëíí° ì½ëê° ëª¨ë¥´ê² userì ìë³ì를 ë¶ì¬í ì ììµëë¤.
ìí© íë를 ë ê°ì í´ë³´ê² ìµëë¤. ì 3ì ì¤í¬ë¦½í¸(ìë°ì¤í¬ë¦½í¸ ë¼ì´ë¸ë¬ë¦¬ ë±)ìì user를 ìë³í´ì¼ íë ìí©ì´ ë²ì´ì¡ë¤ê³ í´ë³´ì£ . userì ìì²ì¸ ìëíí° ì½ë, íì¬ ìì± ì¤ì¸ ì¤í¬ë¦½í¸, ì 3ì ì¤í¬ë¦½í¸ê° ê°ì ìë¡ì ì½ëë 모른 ì± user를 ìë³í´ì¼ íë ìí©ì´ ë²ì´ì¡ìµëë¤.
ì 3ì ì¤í¬ë¦½í¸ìì ìëì ê°ì´ Symbol("id")ì ì´ì©í´ ì ì© ìë³ì를 ë§ë¤ì´ ì¬ì©í ì ììµëë¤.
// ...
let id = Symbol("id");
user[id] = "ì 3 ì¤í¬ë¦½í¸ id ê°";
ì¬ë³¼ì ì ì¼ì±ì´ ë³´ì¥ëë¯ë¡ ì°ë¦¬ê° ë§ë ìë³ìì ì 3ì ì¤í¬ë¦½í¸ìì ë§ë ìë³ìê° ì¶©ëíì§ ììµëë¤. ì´ë¦ì´ ê°ëë¼ë ë§ì´ì£ .
ë§ì½ ì¬ë³¼ ëì 문ìì´ "id"를 ì¬ì©í´ ìë³ì를 ë§ë¤ìë¤ë©´ ì¶©ëì´ ë°ìí ê°ë¥ì±ì´ ììµëë¤.
let user = { name: "John" };
// 문ìì´ "id"를 ì¬ì©í´ ìë³ì를 ë§ë¤ììµëë¤.
user.id = "ì¤í¬ë¦½í¸ id ê°";
// ë§ì½ ì 3ì ì¤í¬ë¦½í¸ê° ì°ë¦¬ ì¤í¬ë¦½í¸ì ëì¼íê² ë¬¸ìì´ "id"를 ì´ì©í´ ìë³ì를 ë§ë¤ìë¤ë©´...
user.id = "ì 3 ì¤í¬ë¦½í¸ id ê°"
// ìëì¹ ìê² ê°ì´ ë®ì´ ì°ì¬ì ì°ë¦¬ê° ë§ë ìë³ìë 무ì미í´ì§ëë¤.
Symbols in a literal
ê°ì²´ 리í°ë´ {...}ì ì¬ì©í´ ê°ì²´ë¥¼ ë§ë ê²½ì°, ëê´í¸ë¥¼ ì¬ì©í´ ì¬ë³¼í í¤ë¥¼ ë§ë¤ì´ì¼ í©ëë¤.
ìì:
let id = Symbol("id");
let user = {
name: "John",
[id]: 123 // "id": 123ì ìë¨
};
"id: 123"ì´ë¼ê³ íë©´, ì¬ë³¼ idê° ìëë¼ ë¬¸ìì´ "id"ê° í¤ê° ë©ëë¤.
ì¬ë³¼ì forâ¦in ìì ë°°ì ë©ëë¤
í¤ê° ì¬ë³¼ì¸ íë¡í¼í°ë for..in ë°ë³µë¬¸ìì ë°°ì ë©ëë¤.
ìì:
let id = Symbol("id");
let user = {
name: "John",
age: 30,
[id]: 123
};
for (let key in user) alert(key); // nameê³¼ ageë§ ì¶ë ¥ëê³ , ì¬ë³¼ì ì¶ë ¥ëì§ ììµëë¤.
// ì¬ë³¼ë¡ ì§ì ì ê·¼íë©´ ì ìëí©ëë¤.
alert( "ì§ì ì ê·¼í ê°: " + user[id] );
Object.keys(user)ììë í¤ê° ì¬ë³¼ì¸ íë¡í¼í°ë ë°°ì ë©ëë¤. 'ì¬ë³¼í íë¡í¼í° ì¨ê¸°ê¸°(hiding symbolic property)'ë¼ ë¶ë¦¬ë ì´ë° ìì¹ ëë¶ì ì¸ë¶ ì¤í¬ë¦½í¸ë ë¼ì´ë¸ë¬ë¦¬ë ì¬ë³¼í í¤ë¥¼ ê°ì§ íë¡í¼í°ì ì ê·¼íì§ ëª»í©ëë¤.
ê·¸ë°ë° Object.assignì í¤ê° ì¬ë³¼ì¸ íë¡í¼í°ë¥¼ ë°°ì íì§ ìê³ ê°ì²´ ë´ ëª¨ë íë¡í¼í°ë¥¼ ë³µì¬í©ëë¤.
let id = Symbol("id");
let user = {
[id]: 123
};
let clone = Object.assign({}, user);
alert( clone[id] ); // 123
ëê° ëª¨ìì´ ìë ê² ê°ì ë³´ì´ì§ë§, ì´ë ìëì ì¼ë¡ ì¤ê³ë ê²ì
ëë¤. ê°ì²´ë¥¼ ë³µì¬íê±°ë ë³í©í ë, ëê° id ê°ì ì¬ë³¼ì í¬í¨í íë¡í¼í° ì ë¶ë¥¼ ì¬ì©íê³ ì¶ì´ í ê²ì´ë¼ë ìê°ìì ì´ë ê² ì¤ê³ëììµëë¤.
ì ì ì¬ë³¼
ìì ì´í´ë³¸ ê²ì²ë¼, ì¬ë³¼ì ì´ë¦ì´ ê°ëë¼ë 모ë ë³ê°ë¡ ì·¨ê¸ë©ëë¤. ê·¸ë°ë° ì´ë¦ì´ ê°ì ì¬ë³¼ì´ ê°ì ê°ì²´ë¥¼ ê°ë¦¬í¤ê¸¸ ìíë ê²½ì°ë ê°ë ììµëë¤. ì í리ì¼ì´ì
곳곳ìì ì¬ë³¼ "id"를 ì´ì©í´ í¹ì íë¡í¼í°ì ì ê·¼í´ì¼ íë¤ê³ ê°ì í´ ë´
ìë¤.
ì ì ì¬ë³¼ ë ì§ì¤í¸ë¦¬(global symbol registry) ë ì´ë° ê²½ì°ë¥¼ ìí´ ë§ë¤ì´ì¡ìµëë¤. ì ì ì¬ë³¼ ë ì§ì¤í¸ë¦¬ ìì ì¬ë³¼ì ë§ë¤ê³ í´ë¹ ì¬ë³¼ì ì ê·¼íë©´, ì´ë¦ì´ ê°ì ê²½ì° íì ëì¼í ì¬ë³¼ì ë°íí´ì¤ëë¤.
ë ì§ì¤í¸ë¦¬ ìì ìë ì¬ë³¼ì ì½ê±°ë, ìë¡ì´ ì¬ë³¼ì ìì±íë ¤ë©´ Symbol.for(key)를 ì¬ì©íë©´ ë©ëë¤.
ì´ ë©ìë를 í¸ì¶íë©´ ì´ë¦ì´ keyì¸ ì¬ë³¼ì ë°íí©ëë¤. ì¡°ê±´ì ë§ë ì¬ë³¼ì´ ë ì§ì¤í¸ë¦¬ ìì ìì¼ë©´ ìë¡ì´ ì¬ë³¼ Symbol(key)ì ë§ë¤ê³ ë ì§ì¤í¸ë¦¬ ìì ì ì¥í©ëë¤.
ìì:
// ì ì ë ì§ì¤í¸ë¦¬ìì ì¬ë³¼ì ì½ìµëë¤.
let id = Symbol.for("id"); // ì¬ë³¼ì´ ì¡´ì¬íì§ ìì¼ë©´ ìë¡ì´ ì¬ë³¼ì ë§ëëë¤.
// ëì¼í ì´ë¦ì ì´ì©í´ ì¬ë³¼ì ë¤ì ì½ìµëë¤(ì¢ ë ë©ë¦¬ ë¨ì´ì§ ì½ëììë ê°ë¥í©ëë¤).
let idAgain = Symbol.for("id");
// ë ì¬ë³¼ì ê°ìµëë¤.
alert( id === idAgain ); // true
ì ì ì¬ë³¼ ë ì§ì¤í¸ë¦¬ ìì ìë ì¬ë³¼ì ì ì ì¬ë³¼ì´ë¼ê³ ë¶ë¦½ëë¤. ì í리ì¼ì´ì ìì ê´ë²ìíê² ì¬ì©í´ì¼ íë ì¬ë³¼ì´ë¼ë©´ ì ì ì¬ë³¼ì ì¬ì©íì¸ì.
Ruby ë±ì ëªëª ì¸ì´ìì ì´ë¦ì´ ê°ì¼ë©´ ì¬ë³¼ë ê°ìµëë¤.
ìë°ì¤í¬ë¦½í¸ìì ì ì ì¬ë³¼ìë§ ì´ë° í¹ì§ì´ ì ì©ë©ëë¤.
Symbol.keyFor
ì ì ì¬ë³¼ì ì°¾ì ë ì¬ì©ëë Symbol.for(key)ì ë°ëëë ë©ìëë ììµëë¤. Symbol.keyFor(sym)를 ì¬ì©íë©´ ì´ë¦ì ì»ì ì ììµëë¤.
ìì:
// ì´ë¦ì ì´ì©í´ ì¬ë³¼ì ì°¾ì
let sym = Symbol.for("name");
let sym2 = Symbol.for("id");
// ì¬ë³¼ì ì´ì©í´ ì´ë¦ì ì»ì
alert( Symbol.keyFor(sym) ); // name
alert( Symbol.keyFor(sym2) ); // id
Symbol.keyForë ì ì ì¬ë³¼ ë ì§ì¤í¸ë¦¬ë¥¼ ë¤ì ¸ì í´ë¹ ì¬ë³¼ì ì´ë¦ì ì»ì´ë
ëë¤. ê²ì ë²ìê° ì ì ì¬ë³¼ ë ì§ì¤í¸ë¦¬ì´ê¸° ë문ì ì ì ì¬ë³¼ì´ ìë ì¬ë³¼ìë ì¬ì©í ì ììµëë¤. ì ì ì¬ë³¼ì´ ìë ì¸ìê° ëì´ì¤ë©´ Symbol.keyForë undefined를 ë°íí©ëë¤.
ì ì ì¬ë³¼ì´ ìë 모ë ì¬ë³¼ì description íë¡í¼í°ê° ììµëë¤. ì¼ë° ì¬ë³¼ìì ì´ë¦ì ì»ê³ ì¶ì¼ë©´ description íë¡í¼í°ë¥¼ ì¬ì©íë©´ ë©ëë¤.
ìì:
let globalSymbol = Symbol.for("name");
let localSymbol = Symbol("name");
alert( Symbol.keyFor(globalSymbol) ); // name, ì ì ì¬ë³¼
alert( Symbol.keyFor(localSymbol) ); // undefined, ì ì ì¬ë³¼ì´ ìë
alert( localSymbol.description ); // name
ìì¤í ì¬ë³¼
'ìì¤í ì¬ë³¼(system symbol)'ì ìë°ì¤í¬ë¦½í¸ ë´ë¶ìì ì¬ì©ëë ì¬ë³¼ì ëë¤. ìì¤í ì¬ë³¼ì íì©íë©´ ê°ì²´ë¥¼ ë¯¸ì¸ ì¡°ì í ì ììµëë¤.
ëª ì¸ì ë´ì í, ì ìë ¤ì§ ì¬ë³¼(well-known symbols)ìì ì´ë¤ ìì¤í ì¬ë³¼ì´ ìëì§ ì´í´ë³´ì¸ì.
Symbol.hasInstanceSymbol.isConcatSpreadableSymbol.iteratorSymbol.toPrimitive- 기í ë±ë±
ê°ì²´ê° ì´ë»ê² ììíì¼ë¡ ë³íëëì§ ì기 ìí´ì Symbol.toPrimitiveì ëí´ ììì¼ íëë°, ìì¸í ë´ì©ì ê³§ ë¤ë£¨ëë¡ íê² ìµëë¤.
ìì¤í ì¬ë³¼ ê°ê°ì ëí ë´ì©ì ì°ê´ëë ìë°ì¤í¬ë¦½í¸ 기ë¥ì íìµíë©´ì ììë³´ê² ìµëë¤.
ìì½
Symbolì ììí ë°ì´í°ë¡, ì ì¼ë¬´ì´í ìë³ì를 ë§ëë ë° ì¬ì©ë©ëë¤.
Symbol()ì í¸ì¶íë©´ ì¬ë³¼ì ë§ë¤ ì ììµëë¤. ì¤ëª
(ì´ë¦)ì ì íì ì¼ë¡ ì¶ê°í ì ììµëë¤.
ì¬ë³¼ì ì´ë¦ì´ ê°ëë¼ë ê°ì´ íì ë¤ë¦
ëë¤. ì´ë¦ì´ ê°ì ë ê°ë ê°ê¸¸ ìíë¤ë©´ ì ì ë ì§ì¤í¸ë¦¬ë¥¼ ì¬ì©í´ì¼ í©ëë¤. Symbol.for(key)ë keyë¼ë ì´ë¦ì ê°ì§ ì ì ì¬ë³¼ì ë°íí©ëë¤. keyë¼ë ì´ë¦ì ê°ì§ ì ì ì¬ë³¼ì´ ìì¼ë©´ ìë¡ì´ ì ì ì¬ë³¼ì ë§ë¤ì´ì¤ëë¤. keyê° ê°ë¤ë©´ Symbol.forë ì´ëì í¸ì¶íë ìê´ìì´ íì ê°ì ì¬ë³¼ì ë°íí´ ì¤ëë¤.
ì¬ë³¼ì 주ì ì ì¤ ì¼ì´ì¤ë ë¤ìê³¼ ê°ìµëë¤.
-
ê°ì²´ì âì¨ê¹â íë¡í¼í° â ì¸ë¶ ì¤í¬ë¦½í¸ë ë¼ì´ë¸ë¬ë¦¬ì âìíâ ê°ì²´ì ìë¡ì´ íë¡í¼í°ë¥¼ ì¶ê°í´ ì£¼ê³ ì¶ë¤ë©´ ì¬ë³¼ì ë§ë¤ê³ , ì´ë¥¼ íë¡í¼í° í¤ë¡ ì¬ì©íë©´ ë©ëë¤. í¤ê° ì¬ë³¼ì¸ ê²½ì°ì
for..inì ëìì´ ëì§ ììì ìëì¹ ìê² íë¡í¼í°ê° ìì ëë ê²ì ìë°©í ì ììµëë¤. ì¸ë¶ ì¤í¬ë¦½í¸ë ë¼ì´ë¸ë¬ë¦¬ë ì¬ë³¼ ì 보를 ê°ê³ ìì§ ììì íë¡í¼í°ì ì§ì ì ê·¼íë ê²ë ë¶ê°ë¥í©ëë¤. ì¬ë³¼í í¤ë¥¼ ì¬ì©íë©´ íë¡í¼í°ê° ì°ì°íë¼ë ì¬ì©ëê±°ë ë®ì´ìì ì§ë 걸 ìë°©í ì ììµëë¤.ì´ë° í¹ì§ì ì´ì©íë©´ ìíë ê²ì ê°ì²´ ìì âìë°íê²â ì¨ê¸¸ ì ììµëë¤. ì¸ë¶ ì¤í¬ë¦½í¸ìì ì°ë¦¬ê° ì¨ê¸´ ê²ì ì ë ë³¼ ì ììµëë¤.
-
ìë°ì¤í¬ë¦½í¸ ë´ë¶ìì ì¬ì©ëë ìì¤í ì¬ë³¼ì
Symbol.*ë¡ ì ê·¼í ì ììµëë¤. ìì¤í ì¬ë³¼ì ì´ì©íë©´ ë´ì¥ ë©ìë ë±ì 기본 ëìì ì ë§ëë¡ ë³ê²½í ì ììµëë¤. iterable ê°ì²´ììSymbol.iterator를, ê°ì²´ë¥¼ ììíì¼ë¡ ë³íí기ììSymbol.toPrimitiveì´ ì´ë»ê² ì¬ì©ëëì§ ììë³´ê² ìµëë¤.
ì¬ì¤ ì¬ë³¼ì ìì í ì¨ê¸¸ ë°©ë²ì ììµëë¤. ë´ì¥ ë©ìë Object.getOwnPropertySymbols(obj)를 ì¬ì©íë©´ 모ë ì¬ë³¼ì ë³¼ ì ìê³ , ë©ìë Reflect.ownKeys(obj)ë ì¬ë³¼í í¤ë¥¼ í¬í¨í ê°ì²´ì 모ë í¤ë¥¼ ë°íí´ì¤ëë¤. ê·¸ë°ë° ëë¶ë¶ì ë¼ì´ë¸ë¬ë¦¬, ë´ì¥ í¨ì ë±ì ì´ë° ë©ìë를 ì¬ì©íì§ ììµëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.