跳到主要内容

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 查找或注册全局symbol
  • Symbol.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...of
    • Symbol.iterator: for await of
  • 字符串
    • Symbol.match: String.prototype.match()
    • Symbol.search: String.prototype.search()
    • Symbol.replace: String.prototype.replace()
    • Symbol.split: String.prototype.split()