ES6知识笔记
ES6知识笔记
学习资料来自于阮一峰的ECMAScript6入门
对象的扩展
object.assign用与对象的合并,但是要注意的是这个方法实行的是浅拷贝,不是深拷贝,所以如果源对象中某个属性的值时对象,那么咪表对象拷贝得到的是这个对象的引用。
其中解构赋值的拷贝也是浅拷贝。
Null传到运算符
obj?.prop // 读取对象属性
obj?.[expr] // 同上
func?.(...args) // 函数或对象方法的调用
new C?.(...args) // 构造函数的调用
Symbol
每一个Subbol都是独一无二的,他的参数是对本身的描述,两个Symbol就算参数一样,他也不相等。
将Symbol值作为对象名称的时候,不能用点运算符。
在教程中Symbol可以用来作为对象的键名来消除出现同名的情况,但是我想的是,虽然定义的symbol是相同的值,但是你最后还是要赋给两个变量,而且你最后引用那个symbol值的时候也是通过那两个变量,那和直接赋给两个变量有什么区别呢?(疑问,待解决)
注意Symbol.for()和Symbol()的区别:
- 这两种写法,都会生成新的 Symbol。它们的区别是,Symbol.for()会被登记在全局环境中供搜索,后者不会。
-
Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key是否已经存在,如果不存在才会新建一个值。
Set和Map数据结构
Set介绍
set类似于数组,但是成员的值都是唯一的,没有重复的值。向set加入值的时候,不会发生类型转换,所以5和’5’是不同的值,他使用比较规则类似精确相等符号(===),但是NaN等于NaN。而且set中两个对象总是不相等的,就算叫它们一样。
Set操作方法
1.add(value):添加某个值,返回Set结构本身。 2.delete(value):删除某个值,返回一个布尔值,表示删除是否成功。 3.has(value):返回一个布尔值,表示该值是否为Set的成员。 4.clear():清除所有成员,没有返回值。
Set遍历方法
1.keys():返回键名的遍历器 2.values():返回键值的遍历器 3.entries():返回键值对的遍历器 4.forEach():使用回调函数遍历每个成员
键名和键值一样。
Weakset
WeakSet 结构与 Set 类似,也是不重复的值的集合。但是,它与 Set 有两个区别。
首先,WeakSet 的成员只能是对象,而不能是其他类型的值。
其次,WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。
Map介绍
JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。
为了解决这个问题,ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。
Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。这就解决了同名属性碰撞(clash)的问题,我们扩展别人的库的时候,如果使用对象作为键名,就不用担心自己的属性与原作者的属性同名。
Map的操作符方法
1.size() 返回Map结构的成员总数。 2.set(key, value) 设置键名key对应的键值value,然后返回整个Map结构。 3.get(key) 读取键名key对应的键值,如果找不到key,返回undefined。 4.has(key) 返回一个布尔值,表示某个键是否在当前的Map对象之中。 5.delect(key) 删除某个键,返回true,如果删除失败,返回false。 6.clear() 清楚所有成员,没有返回值。
Map的遍历方法
1.keys():返回键名的遍历器。 2.values():返回键值的遍历器。 3.entries():返回所有成员的遍历器。 4.forEach():遍历 Map 的所有成。
需要特别注意的是,Map 的遍历顺序就是插入顺序。
Map 结构转为数组结构,比较快速的方法是使用扩展运算符(…)。
WeakMap
WeakMap与Map的区别有两点。
首先,WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。
其次,WeakMap的键名所指向的对象,不计入垃圾回收机制。
注意,WeakMap 弱引用的只是键名,而不是键值。键值依然是正常引用。
WeakMap 应用的典型场合就是 DOM 节点作为键名。只要删除了DOM节点,关于这个DOM节点的所有时间就会自动消失,不会出现内存泄漏的问题。进一步说,注册监听事件的listener对象,就很合适用 WeakMap 实现。
Proxy
Proxy用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。
Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理,用在这里表示由它来“代理”某些操作,可以译为“代理器”。
Proxy中this的指向:在 Proxy 代理的情况下,目标对象内部的this关键字会指向 Proxy 代理。而不是Proxy代理的目标对象。
可以使用bind保定原始对象。
—
Promise对象
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了Promise对象。
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。
Promise实例具有then方法,也就是说,then方法是定义在原型对象Promise.prototype上的。它的作用是为Promise实例添加状态改变时的回调函数。前面说过,then方法的第一个参数是Resolved状态的回调函数,第二个参数(可选)是Rejected状态的回调函数。then方法返回的是一个新的Promise实例(注意,不是原来那个Promise实例)。
可以用来解决ajax中调用函数多层嵌套的问题。