TypeScript实例讲解(十六)

418 阅读2分钟

这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

接上一篇:TypeScript实例讲解(十五)

本篇内容:TypeScript Symbols。

自 ECMAScript 2015 起,symbol 成为了一种新的原生类型,就像 numberstring 一样。symbol 类型的值是通过 Symbol 构造函数创建的。

定义 Symbol

// 例 1
let sym1 = Symbol();
let sym2 = Symbol("key");
let sym3 = Symbol("key");

例1使用 Symbol 函数生成了三个 Symbol 类型的变量,分别是 sym1sym2sym3。Symbol 函数接收一个字符串类型的参数,代表描述。 sym2sym3 有相同的描述,那这两个变量是否相等呢?

// 例 2
console.log(typeof sym1);    // 'symbol'
console.log(sym2 === sym3)   // false

我们让 sym2 等于 sym3 并打印出结果,结果为 false 。即使创建了两个相同描述的 Symbol,但它们每一个都是独一无二的,描述只是用来区分。

Symbol 作为属性名

// 例 3
let sym = Symbol();
let obj = {
    [sym]: "value"
};
console.log(obj[sym]);   // "value"

symbols 也可以被用做对象属性的键,或声明对象的属性和类成员。
因为 symbol 值是独一无二的,当它作为属性名时,不会和其他任何属性名重复。

内置 symbols

除了我们自己定义的 symbols,还有一些内置 symbols,用来表示语言内部的行为。

Symbol.hasInstance
方法,会被 instanceof 运算符调用。构造器对象用来识别一个对象是否是其实例。

Symbol.isConcatSpreadable
布尔值,表示当在一个对象上调用 Array.prototype.concat 时,这个对象的数组元素是否可展开。

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
方法,被 ToPrimitive 抽象操作调用。把对象转换为相应的原始值。

Symbol.toStringTag
方法,被内置方法 Object.prototype.toString 调用。返回创建对象时默认的字符串描述。

Symbol.unscopables
对象,它自己拥有的属性会被with作用域排除在外。

这11个内置的 symbol 值,在设计一些高级逻辑时,可能会用到,大部分业务开发很少用到。

本篇完!如果文章对你有一点点帮助,请记得点个赞哦。