目录
1.symbol可以传递参做为唯一标识,只支持 string 和 numeber的参数,且symbol的值是唯一的
2.symbol.for,如果for中key注册过,则可以直接使用,而不是创建一个新的的key
1.iterator支持遍历大部分类型,如arr,nodeList,argumetns,set,map等
3.对象类型不能使用for of,因为对象不具有iterator
一、symbol类型
1.symbol可以传递参做为唯一标识,只支持 string 和 numeber的参数,且symbol的值是唯一的
let a1: symbol = Symbol(1) let a2: symbol = Symbol(1) let a3: symbol = Symbol('num') console.log(a1 === a2); //结果为false
2.symbol.for,如果for中key注册过,则可以直接使用,而不是创建一个新的的key
console.log(Symbol.for('123') === Symbol.for('123')); //结果为true
3.symbol可以用作对象属性的键
let sym = Symbol() let obj = { [sym]: '1' } console.log(obj[sym]); //结果为1
4.symbol中定义的属性如何拿到
let a1: symbol = Symbol(1) let a2: symbol = Symbol(1) let obj = { [a1]: '123', [a2]: '123', name: '小胖' } //方法一,只能拿到对象中所有的symbol类型,其他的拿不到 console.log(Object.getOwnPropertySymbols(obj)); //结果为[ Symbol(1), Symbol(1) ] //方法二,拿到对象中的所有属性 console.log(Reflect.ownKeys(obj)); //结果为[ 'name', Symbol(1), Symbol(1) ]
二、iterator迭代器
1.iterator支持遍历大部分类型,如arr,nodeList,argumetns,set,map等
let set: Set<number> = new Set([1, 1, 2, 3, 4, 4]) //set数组去重 let map: Map<any, any> = new Map() //<key,value> let Arr = [1, 2, 3] map.set(Arr, '小胖') function args() { console.log(arguments); } //迭代器遍历 const test = (value: any) => { let It: any = value[Symbol.iterator]() let next: any = { done: false } while (!next.done) { next = It.next() if (!next.done) console.log(next.value); } } test(set) //遍历结果为 1 2 3 4
2.iterator迭代器语法糖为for of
for (let key of map) { console.log(key); } //结果为[ [ 1, 2, 3 ], '小胖' ]
3.对象类型不能使用for of,因为对象不具有iterator
4.数组结构和...也是通过iterator实现的
let [a, b, c] = [1, 2, 3] let Arr = [4, 5, 6] let num = [...Arr] console.log(a, b, c); console.log(Arr);
三、generator生成器
function* test() { yield Promise.resolve('测试') //yield后面加同步异步均可 yield 1 yield 2 yield 3 } const dotest = test() console.log(dotest.next()); //next每次执行只调用一个 console.log(dotest.next()); console.log(dotest.next()); console.log(dotest.next()); console.log(dotest.next());