TypeScript学习3、ES6 Symbol
ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。
const s1 = Symbol();
const s2 = Symbol();
console.log(s1 === s2) // false
Symbol 函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,可用于调试但不能访问symbol本身。
const s3 = Symbol('hello');
传入数字会当做字符串处理
const s4 = Symbol(123);
每个从Symbol()返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符,Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。Symbol 值作为对象属性名时,不能用点运算符,要使用[]。
let prop = 'name';
let info = {
[prop]:'tina'
}
console.log(info[prop]) //tina
let s5 = Symbol('name');
let info2 = {
[s5]: 'tina',
age: 18
}
info2[s5] = 'bob'
console.log(info2[s5]) //'bob'
当使用了Symbol作为对象的属性的标识符后,在对该对象进行key的枚举时。
for in:未找到Symbol属性的标识符。
for (const key in info2) {
console.log(key)// age
}
Object.keys(obj):未找到Symbol属性的标识符。
console.log(Object.keys(info2)) //[age]
Object.getOwnPropertyNames(obj):未找到Symbol属性的标识符。
console.log(Object.getOwnPropertyNames(info2))//[age]
JSON.stringify(obj):未找到Symbol属性的标识符。
console.log(JSON.stringify(info2)) //{"age":18}
有上述代码可知Symbol类型的属性描述符,它未被包含到自身属性名集合中,我们可以把一些不需要对外操作和访问的属性使用Symbol来定义。
当然也有专门获取对象中Symbol属性的标识符的方法Object.getOwnPropertySymbols(obj)和Reflect.ownKeys(obj)
console.log(Object.getOwnPropertySymbols(info2)) //[Symbol(name)]
console.log(Reflect.ownKeys(info2)) //["age", Symbol(name)]
Symbol 静态方法
Symbol.for(key)使用给定的key搜索现有的symbol,如果找到则返回该symbol。否则将使用给定的key在全局symbol注册表中创建一个新的symbol。
let s6 = Symbol.for('s6');
let _s6 = Symbol.for('s6');
console.log(s6 === _s6) //true
Symbol.keyFor(sym)从使用Symbol.for(key)注册的全局symbol中,为给定的symbol检索一个共享的?symbol key。
console.log(Symbol.keyFor(s6)); //'s6'
es6自带的Symbol值
Symbol.iterator
一个返回一个对象默认迭代器的方法。被 for...of 使用。
Symbol.asyncIterator
一个返回对象默认的异步迭代器的方法。被 for await of 使用。
Symbol.match
一个用于对字符串进行匹配的方法,也用于确定一个对象是否可以作为正则表达式使用。被 String.prototype.match() 使用。
Symbol.replace
一个替换匹配字符串的子串的方法. 被 String.prototype.replace() 使用。
Symbol.search
一个返回一个字符串中与正则表达式相匹配的索引的方法。被String.prototype.search() 使用。
Symbol.split
一个在匹配正则表达式的索引处拆分一个字符串的方法.。被 String.prototype.split() 使用。
Symbol.hasInstance
一个确定一个构造器对象识别的对象是否为它的实例的方法。被 instanceof 使用。
Symbol.isConcatSpreadable
一个布尔值,表明一个对象是否应该flattened为它的数组元素。被 Array.prototype.concat() 使用。
Symbol.unscopables
拥有和继承属性名的一个对象的值被排除在与环境绑定的相关对象外。
Symbol.species
一个用于创建派生对象的构造器函数。
Symbol.toPrimitive
一个将对象转化为基本数据类型的方法。
Symbol.toStringTag
用于对象的默认描述的字符串值。被 Object.prototype.toString() 使用。