Symbol
自ECMAScript 2015起,symbol成为了一种新的原生类型,就像number和string一样。
symbol类型的值是通过Symbol构造函数创建的。
可以传递参做为唯一标识 只支持 string 和 number类型的参数
使用symbol定义的属性,是不能通过如下方式遍历拿到的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| const symbol1 = Symbol('666') const symbol2 = Symbol('777') const obj1= { [symbol1]: '小满', [symbol2]: '二蛋', age: 19, sex: '女' }
for (const key in obj1) { console.log(key) }
Object.keys(obj1) console.log(Object.keys(obj1))
console.log(Object.getOwnPropertyNames(obj1))
console.log(JSON.stringify(obj1))
|
可以通过以下两种方法拿到:
1 2 3 4 5 6 7
| Object.getOwnPropertySymbols(obj1); console.log(Object.getOwnPropertySymbols(obj1));
Reflect.ownKeys(obj1); console.log(Reflect.ownKeys(obj1));
|
迭代器和生成器
支持遍历大部分类型迭代器 arr nodeList argumetns set map 等
1 2 3 4 5 6 7 8
| var arr = [1,2,3,4]; let iterator = arr[Symbol.iterator](); console.log(iterator.next()); console.log(iterator.next()); console.log(iterator.next()); console.log(iterator.next()); console.log(iterator.next());
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| interface Item { age: number, name: string } const array: Array<Item> = [{ age: 123, name: "1" }, { age: 123, name: "2" }, { age: 123, name: "3" }] type mapTypes = string | number const map:Map<mapTypes,mapTypes> = new Map() map.set('1','王爷') map.set('2','陆北') const obj = { aaa:123, bbb:456 } let set:Set<number> = new Set([1,2,3,4,5,6])
const gen = (erg:any): void => { let it: Iterator<any> = erg[Symbol.iterator]() let next:any= { done: false } while (!next.done) { next = it.next() if (!next.done) { console.log(next.value) } } } gen(array)
|
语法糖
平时开发中最常用的就是for of
1 2 3
| for (let value of map) { console.log(value) }
|
数组解构的原理其实也是调用迭代器
1 2 3
| var [a,b,c] = [1,2,3] var x = [...xxxx]
|
那我们可以自己实现一个迭代器让对象支持for or
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| const obj = { max: 5, current: 0, [Symbol.iterator]() { return { max: this.max, current: this.current, next() { if (this.current == this.max) { return { value: undefined, done: true } } else { return { value: this.current++, done: false } } } } } } console.log([...obj]) for (let val of obj) { console.log(val); }
|