转载:《TypeScript 中文入门教程》 16、Symbols
文章转载自:https://github.com/zhongsp
介绍
至 ECMAScript 2015 开始,symbol 成为了一种新的原始类型,就像 number 和 string 一样。
symbol 类型的值是通过 Symbol 构造函数创建的:
var sym1 = Symbol();
var sym2 = Symbol("key"); // 可选的字符串 key
Symbols 是不可改变的且唯一的:
var sym2 = Symbol("key");
var sym3 = Symbol("key");
sym2 === sym3; // false,symbols 是唯一的
像字符串一样,symbols 也可以被用做对象属性的键:
let sym = Symbol();
let obj = {};
obj[sym] = "value";
console.log(obj[sym]); // "value"
Symbols 也可以与计算出的属性名声明相结合:
const getClassNameSymbol = Symbol();
class C {
[getClassNameSymbol](){
return "C";
}
}
let c = new C();
let className = c[getClassNameSymbol](); // "C"
内置 Symbols
除了用户定义的 symbols,还有一些已经熟悉的内置 symbols,用来表示语言内部的行为:
Symbol.hasInstance- 被instanceof运算符调用Symbol.isConcatSpreadable- 表示数组元素是否可展开Symbol.iterator- 返回对象的默认迭代器,被for-of语句调用Symbol.match- 正则表达式方法用来匹配字符串,被String.prototype.match调用Symbol.replace- 被String.prototype.replace调用Symbol.search- 被String.prototype.search调用Symbol.species- 值为一个构造函数,用来创建对象实例Symbol.split- 被String.prototype.split调用Symbol.toPrimitive- 把对象转换为相应的原始值Symbol.toStringTag- 被Object.prototype.toString调用Symbol.unscopables- 被with作用域排除在外的属性