Symbol
åºçº¿
广æ³å¯ç¨
*
èª 2015å¹´9æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
* æ¤ç¹æ§çæäºé¨åçæ¯æç¨åº¦å¯è½ææä¸åã
symbol æ¯ä¸ç§åå§æ°æ®ç±»åãSymbol() 彿°ä¼è¿å symbol ç±»åçå¼ï¼è¯¥ç±»åå
·æéæå±æ§åéææ¹æ³ãå®çéæå±æ§ä¼æ´é²å 个å
建çæå对象ï¼å®çéææ¹æ³ä¼æ´é²å
¨å±ç symbol 注åï¼ä¸ç±»ä¼¼äºå
建对象类ï¼ä½ä½ä¸ºæé 彿°æ¥è¯´å®å¹¶ä¸å®æ´ï¼å 为å®ä¸æ¯æè¯æ³ï¼"new Symbol()"ã
æ¯ä¸ªä» Symbol() è¿åç symbol å¼é½æ¯å¯ä¸çãä¸ä¸ª symbol å¼è½ä½ä¸ºå¯¹è±¡å±æ§çæ è¯ç¬¦ï¼è¿æ¯è¯¥æ°æ®ç±»åä»
æçç®çãæ´è¿ä¸æ¥çè§£æè§ââglossary entry for Symbolã
å°è¯ä¸ä¸
const symbol1 = Symbol();
const symbol2 = Symbol(42);
const symbol3 = Symbol("foo");
console.log(typeof symbol1);
// Expected output: "symbol"
console.log(symbol2 === 42);
// Expected output: false
console.log(symbol3.toString());
// Expected output: "Symbol(foo)"
console.log(Symbol("foo") === Symbol("foo"));
// Expected output: false
è¯æ³
Symbol([description])
åæ°
descriptionå¯é-
å¯éçï¼å符串类åã对 symbol çæè¿°ï¼å¯ç¨äºè°è¯ä½ä¸æ¯è®¿é® symbol æ¬èº«ã
æè¿°
ç´æ¥ä½¿ç¨Symbol()å建æ°ç symbol ç±»åï¼å¹¶ç¨ä¸ä¸ªå¯éçå符串ä½ä¸ºå
¶æè¿°ã
var sym1 = Symbol();
var sym2 = Symbol("foo");
var sym3 = Symbol("foo");
ä¸é¢ç代ç å建äºä¸ä¸ªæ°ç symbol ç±»åãæ³¨æï¼Symbol("foo") ä¸ä¼å¼ºå¶å°å符串âfooâè½¬æ¢æ symbol ç±»åã宿¯æ¬¡é½ä¼å建ä¸ä¸ªæ°ç symbol ç±»åï¼
Symbol("foo") === Symbol("foo"); // false
ä¸é¢å¸¦æ new è¿ç®ç¬¦çè¯æ³å°æåº TypeError é误ï¼
var sym = new Symbol(); // TypeError
è¿ä¼é»æ¢å建ä¸ä¸ªæ¾å¼ç Symbol å
è£
å¨å¯¹è±¡è䏿¯ä¸ä¸ª Symbol å¼ãå´ç»åå§æ°æ®ç±»åå建ä¸ä¸ªæ¾å¼å
è£
å¨å¯¹è±¡ä» ECMAScript 6 å¼å§ä¸åè¢«æ¯æãç¶èï¼ç°æçåå§å
è£
å¨å¯¹è±¡ï¼å¦ new Booleanãnew String以ånew Numberï¼å 为éçåå ä»å¯è¢«å建ã
å¦æä½ ççæ³å建ä¸ä¸ª Symbol å
è£
å¨å¯¹è±¡ (Symbol wrapper object)ï¼ä½ å¯ä»¥ä½¿ç¨ Object() 彿°ï¼
var sym = Symbol("foo");
typeof sym; // "symbol"
var symObj = Object(sym);
typeof symObj; // "object"
å ¨å±å ±äº«ç Symbol
ä¸é¢ä½¿ç¨ Symbol() 彿°çè¯æ³ï¼ä¸ä¼å¨ä½ çæ´ä¸ªä»£ç åºä¸å建ä¸ä¸ªå¯ç¨çå
¨å±ç symbol ç±»åãè¦å建跨æä»¶å¯ç¨ç symbolï¼çè³è·¨åï¼æ¯ä¸ªé½æå®èªå·±çå
¨å±ä½ç¨åï¼ï¼ä½¿ç¨ Symbol.for() æ¹æ³å Symbol.keyFor() æ¹æ³ä»å
¨å±ç symbol 注å表设置ååå¾ symbolã
å¨å¯¹è±¡ä¸æ¥æ¾ Symbol 屿§
Object.getOwnPropertySymbols() æ¹æ³è®©ä½ 卿¥æ¾ä¸ä¸ªç»å®å¯¹è±¡ç符å·å±æ§æ¶è¿åä¸ä¸ª symbol ç±»åçæ°ç»ã注æï¼æ¯ä¸ªåå§åçå¯¹è±¡é½æ¯æ²¡æèªå·±ç symbol 屿§çï¼å æ¤è¿ä¸ªæ°ç»å¯è½ä¸ºç©ºï¼é¤éä½ å·²ç»å¨å¯¹è±¡ä¸è®¾ç½®äº symbol 屿§ã
屿§
Symbol.length-
é¿åº¦å±æ§ï¼å¼ä¸º 0ã
Symbol.prototype-
symbolæé 彿°çååã
å ç½®éç¨ï¼well-knownï¼symbol
é¤äºèªå·±å建ç symbolï¼JavaScript è¿å 建äºä¸äºå¨ ECMAScript 5 ä¹åæ²¡ææ´é²ç»å¼åè ç symbolï¼å®ä»¬ä»£è¡¨äºå é¨è¯è¨è¡ä¸ºãå®ä»¬å¯ä»¥ä½¿ç¨ä»¥ä¸å±æ§è®¿é®ï¼
- è¿ä»£ symbols
Symbol.iterator -
ä¸ä¸ªè¿åä¸ä¸ªå¯¹è±¡é»è®¤è¿ä»£å¨çæ¹æ³ã被
for...of使ç¨ã Symbol.asyncIterator-
ä¸ä¸ªè¿å对象é»è®¤ç弿¥è¿ä»£å¨çæ¹æ³ã被
for await of使ç¨ã - æ£åè¡¨è¾¾å¼ symbols
Symbol.match -
ä¸ä¸ªç¨äºå¯¹å符串è¿è¡å¹é çæ¹æ³ï¼ä¹ç¨äºç¡®å®ä¸ä¸ªå¯¹è±¡æ¯å¦å¯ä»¥ä½ä¸ºæ£å表达å¼ä½¿ç¨ã被
String.prototype.match()使ç¨ã Symbol.replace-
ä¸ä¸ªæ¿æ¢å¹é å符串çåä¸²çæ¹æ³ã被
String.prototype.replace()使ç¨ã Symbol.search-
ä¸ä¸ªè¿åä¸ä¸ªå符串ä¸ä¸æ£å表达å¼ç¸å¹é çç´¢å¼çæ¹æ³ã被
String.prototype.search()使ç¨ã Symbol.split-
ä¸ä¸ªå¨å¹é æ£å表达å¼çç´¢å¼å¤æåä¸ä¸ªåç¬¦ä¸²çæ¹æ³.ã被
String.prototype.split()使ç¨ã - å
¶ä» symbols
Symbol.hasInstance -
ä¸ä¸ªç¡®å®ä¸ä¸ªæé å¨å¯¹è±¡è¯å«ç对象æ¯å¦ä¸ºå®çå®ä¾çæ¹æ³ã被
instanceof使ç¨ã Symbol.isConcatSpreadable-
ä¸ä¸ªå¸å°å¼ï¼è¡¨æä¸ä¸ªå¯¹è±¡æ¯å¦åºè¯¥ flattened 为å®çæ°ç»å ç´ ã被
Array.prototype.concat()使ç¨ã Symbol.unscopables-
æ¥æåç»§æ¿å±æ§åçä¸ä¸ªå¯¹è±¡çå¼è¢«æé¤å¨ä¸ç¯å¢ç»å®çç¸å ³å¯¹è±¡å¤ã
Symbol.species-
ä¸ä¸ªç¨äºå建派ç对象çæé å¨å½æ°ã
Symbol.toPrimitive-
ä¸ä¸ªå°å¯¹è±¡è½¬åä¸ºåºæ¬æ°æ®ç±»åçæ¹æ³ã
Symbol.toStringTag-
ç¨äºå¯¹è±¡çé»è®¤æè¿°çå符串å¼ã被
Object.prototype.toString()使ç¨ã
æ¹æ³
Symbol.for(key)-
使ç¨ç»å®ç key æç´¢ç°æç symbolï¼å¦ææ¾å°åè¿å该 symbolãå¦åå°ä½¿ç¨ç»å®ç key å¨å ¨å± symbol 注å表ä¸å建ä¸ä¸ªæ°ç symbolã
Symbol.keyFor(sym)-
ä»å ¨å± symbol 注å表ä¸ï¼ä¸ºç»å®ç symbol æ£ç´¢ä¸ä¸ªå ±äº«ç symbol keyã
Symbol åå
ææ Symbols ç»§æ¿èª Symbol.prototype.
å®ä¾å±æ§
Symbol.prototype.description-
ä¸ä¸ªåªè¯»çåç¬¦ä¸²ï¼æä¸ºå¯¹è¯¥ Symbol 对象çæè¿°
å®ä¾æ¹æ³
Symbol.prototype.toSource-
è¿å该 Symbol å¯¹è±¡çæºä»£ç ãè¯¥æ¹æ³éåäº
Object.prototype.toSourceæ¹æ³ Symbol.prototype.toString-
è¿åä¸ä¸ªå å«ç该 Symbol 对象æè¿°çå符串ãè¯¥æ¹æ³éåäº
Object.prototype.toStringæ¹æ³ Symbol.prototype.valueOf-
è¿å该 Symbol 对象ãè¯¥æ¹æ³éåäº
Object.prototype.valueOfæ¹æ³ Symbol.toPrimitive-
è¿å该 Symbol 对象ã
示ä¾
>对 symbol ä½¿ç¨ typeof è¿ç®ç¬¦
typeofè¿ç®ç¬¦è½å¸®å©ä½ è¯å« symbol ç±»å
typeof Symbol() === "symbol";
typeof Symbol("foo") === "symbol";
typeof Symbol.iterator === "symbol";
Symbol ç±»å转æ¢
å½ä½¿ç¨ symbol å¼è¿è¡ç±»åè½¬æ¢æ¶éè¦æ³¨æä¸äºäºæ ï¼
- å°è¯å°ä¸ä¸ª symbol å¼è½¬æ¢ä¸ºä¸ä¸ª number 弿¶ï¼ä¼æåºä¸ä¸ª
TypeErroré误 (e.g.+symorsym | 0). - 使ç¨å®½æ¾ç¸çæ¶ï¼
Object(sym) == symreturnstrue. - è¿ä¼é»æ¢ä½ ä»ä¸ä¸ª symbol å¼éå¼å°å建ä¸ä¸ªæ°ç string ç±»åç屿§åãä¾å¦ï¼
Symbol("foo") + "bar"å°æåºä¸ä¸ªTypeError(can't convert symbol to string). - "safer"
String(sym)conversion çä½ç¨ä¼å symbol ç±»åè°ç¨Symbol.prototype.toString()䏿 ·ï¼ä½æ¯æ³¨ænew String(sym)å°æåºå¼å¸¸ã
Symbols ä¸ for...in è¿ä»£
Symbols å¨ for...in è¿ä»£ä¸ä¸å¯æä¸¾ãå¦å¤ï¼Object.getOwnPropertyNames() ä¸ä¼è¿å symbol 对象ç屿§ï¼ä½æ¯ä½ è½ä½¿ç¨ Object.getOwnPropertySymbols() å¾å°å®ä»¬ã
var obj = {};
obj[Symbol("a")] = "a";
obj[Symbol.for("b")] = "b";
obj["c"] = "c";
obj.d = "d";
for (var i in obj) {
console.log(i); // logs "c" and "d"
}
Symbols ä¸ JSON.stringify()
å½ä½¿ç¨ JSON.stringify() æ¶ï¼ä»¥ symbol å¼ä½ä¸ºé®ç屿§ä¼è¢«å®å ¨å¿½ç¥ï¼
JSON.stringify({ [Symbol("foo")]: "foo" });
// '{}'
æ´å¤ç»èï¼è¯·ç JSON.stringify()ã
Symbol å è£ å¨å¯¹è±¡ä½ä¸ºå±æ§çé®
å½ä¸ä¸ª Symbol å è£ å¨å¯¹è±¡ä½ä¸ºä¸ä¸ªå±æ§ç鮿¶ï¼è¿ä¸ªå¯¹è±¡å°è¢«å¼ºå¶è½¬æ¢ä¸ºå®å è£ è¿ç symbol å¼ï¼
var sym = Symbol("foo");
var obj = { [sym]: 1 };
obj[sym]; // 1
obj[Object(sym)]; // still 1
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-symbol-objects> |