Symbol - 符号
ES6中引入的类型,用于对象的非字符串键值。通过全局Symbol函数创建,每个返回值都是唯一的。
let firstSymbol = Symbol('key');
let secondSymbol = Symbol('key');
firstSymbol === secondSymbol; // false
不支持new
new Symbol('key'); // TypeError
Symbol是不可迭代的
let o = new Object;
o[Symbol('a')] = 'a';
o['b'] = 'b';
for (let i in o) {
console.log(i); // 'b'
}
console.log(Object.getOwnPropertySymbols(o)); // '[Symbol('a')]'
注册、取得全局symbol
Symbol.for(key)会基于给定的 key 查找或注册全局symbolSymbol.keyFor(symbol)会基于给定的 symbol 查找全局symbol key
内建全局symbols
除了自己创建的symbols,JavaScript还内建有很多用于各种语言内部行为。可以通过替换的方式修改默认行为,例如可以通过修改对象的Symbol.iterator来修改for...of的行为:
let o = new Object;
o[Symbol.iterator] = () => {
let value = 0;
return {
next: () => ({ value: value++, done: value > 3 })
}
};
for (let value of o) {
console.log(value); // 0,1,2
}
简单列一些比较浅显的Symbol:
- 迭代
Symbol.iterator:for...ofSymbol.iterator:for await of
- 字符串
Symbol.match:String.prototype.match()Symbol.search:String.prototype.search()Symbol.replace:String.prototype.replace()Symbol.split:String.prototype.split()