Symbol 数据类型
ES6 引入了一个内置全局函数,该函数会创建一个新的原始数据类型,表示独一无二的值
特点:
- **值****唯一**,可以用来解决命名冲突,当作唯一标识
Symbol
值不能参与运算(与自己也不行)Symbol
定义的对象属性不能使用 for in 循环遍历- 可以使用
Reflects.ownKeys
来获取对象的所有键名
- 可以使用
使用:
1 | let a = Symbol(); |
创建 Symbol 的两种方式
1 | let s1 = Symbol("Foo"); |
七种数据类型巧记
USONB – U R SO N B
Undefined
String、Symbol
Object
Null
Boolean
迭代器
- 迭代器
(iterator)
是一种接口,为各种不同的数据结构提供统一的访问机制。也就是说,只要数据结构种部署了该接口,那么它就可以遍历 - ES6 还引入了一个新的遍历命令与之搭配:
for...of
循环遍历
原生具备 iterator 接口的数据结构:
Array
Agruments
Set
Map
String
TypedArray
NodeList
底层机制
- 数据结构中,(以数组为例),iterator 接口表现为一个函数
Array.prototype.Symbol.iterator()
- 它创建一个指针对象 iterator,指向数据结构的起始位置
- 其内部有一个
next()
方法用于遍历 - 第一次调用对象的
next
方法,指针自动指向数据结构的第一个成员 - 不断调用
next
方法,指针一直向后移动,直到指向最后一个成员 - 每次
next
方法返回一个包含value
和done
属性的对象
论证:
1 | const arr = ["浩宇", "Foo", "Bar"]; |
与 for…in 区别
1 | const arr = ["浩宇", "Foo", "Bar"]; |
for …in 保存的是键名
**for …of 遍历的是****键值**
迭代器应用
自定义遍历数据
举个栗子:
JS 原生对象中并无迭代器,此时若想随心遍历该对象中的一个数组,要怎样做呢–
- 手撕一个迭代器,然后用
for ...of
遍历它
1 | const LPL = { |
生成器
ES6 提出了一个异步编程解决方案,语法行为与传统函数完全不同
- 它是一个可以多次返回的函数
- 用于异步编程,可解决回调地狱
- 它很像
Python
的生成器,这是因为“ES6 定义generator
标准的哥们借鉴了 Python 的generator
的概念和语法” - 可以用
yield
返回多次
定义:
1 | function* gen() { |
- 查看内部属性发现它是一个类迭代器对象,拥有和迭代器一样的
next
方法 - 因此,直接调用时它只是创建了一个生成器对象,而没有执行代码段
执行:
我们可以像使用迭代器那样使用它,因此有两种方式执行生成器
- 使用
next()
方法next()
方法会执行generator
的代码,然后,每次遇到yield
,就返回一个对象{value: , done: true/false}
- 返回的
value
就是yield
的返回值 done
表示这个generator
是否已经执行结束了- 如果
done
为 true,则value
就是return
的返回值
- 使用
for... of
生成器的函数可以传参
生成器异步编程实例
解决回调地狱
需求:1s 后输出 111,2s 后输出 222,3s 后输出 333
传统写法
1 | setTimeout(() => { |
使用生成器
1 | let fn1 = () => { |
评论