什么是Symbol?
- Symbol代表唯一值,Symbo 只能传 string number
let s: symbol = Symbol('亚索') let s1: symbol = Symbol('亚索') console.log(s) // Symbol(亚索) console.log(s1) // Symbol(亚索) console.log(s == s1) // false
- s 和 s1 是不互相等于的 存储的内存地址不同
使用场景
- 一般对象的key使用的比较多
let obj = { [s]: 'val', // symbol [s1]: 'msg', // symbol age: 12, sex: 'man', } console.log(obj) // { age: 12, sex: 'man', [Symbol(亚索)]: 'val', [Symbol(亚索)]: 'msg' }
- symbol 和普通的 key 什么区别呢
- 比如循环的时候以下这几种方式 都不会打印出 symbol
for (let key in obj) { console.log(key) // age sex } Object.keys(obj) // ['age','sex'] Object.getOwnPropertyNames(obj) // ['age','sex'] JSON.stringify(obj) //{"age":12,"sex":"man"}
- 怎么对 symbol 取值
- Reflect.ownKeys 方法会把所有的key都给打印出来
Object.getOwnPropertySymbols(obj) // [ Symbol(亚索), Symbol(亚索) ] Reflect.ownKeys(obj) // [ 'age', 'sex', Symbol(亚索), Symbol(亚索) ]
symbol 迭代器和 生成器 for of
- 迭代器
- symbol 支持大部分迭代器 arr set map等
let arr: Array<number> = [1, 2, 3] let item: Iterator<number> = arr[Symbol.iterator]() // 可以调用3次,可以通过 done 来区分是否循环完毕 // console.log(item.next()) // { value: 1, done: false } // console.log(item.next()) // { value: 2, done: false } // console.log(item.next()) // { value: 3, done: false } // console.log(item.next()) // { value: undefined, done: true } type mapKey = string | number let set: Set<number> = new Set([1, 2, 3]) let map: Map<mapKey, mapKey> = new Map() map.set('0', '瑞雯') map.set('1', '艾克')
- 迭代器例子
- 只能迭代数组,对象是不支持的
function fn(e: any) { let item: Iterator<any> = e[Symbol.iterator]() let next: any = { done: false } while (!next.done) { next = item.next() if (!next.done) { console.log(next) } } } fn(map)
- symbol 支持大部分迭代器 arr set map等
- 生成器 for of
- for of 同样对象也是不支持的
for (let item of arr) { console.log(item) // 1 2 3 }
- for of 和 for in 区别
- for of 是直接把数组的值给打印出来
- for in 打印是索引
for (let item in arr) { console.log(item) // 0 1 2 }
- for of 同样对象也是不支持的
Symbol列表
- 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作用域排除在外。