结构赋值
解构的方式都是根据key来实现的
1 | // 数组 |
1 | // 对象 |
用:来重新命名 用=来赋值默认值
1 | let {name,age:age1, addr="杭州"} = {name: '加菲', age: 18}; |
剩余运算符 只能用在最后一项
1 | // 数组 |
1 | // 对象 |
展开运算符
1 | // 数组 |
1 | // 对象 |
展开运算符 可以合并数组 合并对象
1 | // 数组 |
1 | // 对象 |
Set & Map
set 、 map 是es6中新的数据类型 不能放重复项
1 | let set = new Set([1,2,3,3]); |
示例
数组的去重 并集 交集 差集
并集
1 | let a1 = [1,2,3,1,2,3]; |
交集
1 | let a1 = [1,2,3,1,2,3]; |
差集
你有的我没有
1 | let a1 = [1,2,3,1,2,3]; |
对象的结构赋值
1 | let school = {name: '加菲', age: 18}; |
如果key 一样 会被后面的值覆盖
1 | let school = {name: '加菲', age: 18}; |
1 | let school = {name: '加菲', age: 18, a: {b:1}}; |
这里面 addr里面的值也改变了,因为引用的是同一个地址
现在这里是浅拷贝
如何实现深拷贝:
1 | // JSON.parse JSON.stringify |
可以实现 但是如下:
1 | let school = {name: '加菲', age: 18, a: {b:1}, b: ()=>{}, c: undefined, reg: /\d+/}; |
所以说 函数、undefined、正则不能完全拷贝
递归拷贝
首先要判断数据类型
instanceof 可以判断类型 判断是谁的实例
constructor 构造函数
在控制台打印 ({}).constructor ([]).constructor 可以知道它的构造函数是谁 是什么类型的 Object() Array()
1 | const deepClone = (value) => { |
这样的深拷贝还有问题 会有死循环的可能,如下
1 | let obj = {b: 1}; |
解决 如果obj已经被拷贝一次了,下次在用到obj的时候 直接返回 不用再次拷贝
Map:
1 | let newMap = new Map([[1,2], [3,4]]); // 存的是键值对的形式 也是不能放重复的项 用法和Set差不多 |
现在将key的值变为了一个对象 如下:
1 | let newMap = new Map([[{a: 1},2], [3,4]]); |
但是这样会有一个问题 容易造成内存泄漏,如下:
新建一个html文件
1 | <html> |
下面就可以用WeakMap来记录已经被拷贝的值 防止重复拷贝
1 | const deepClone = (value, hash = new WeakMap()) => { |
tips:
null == undefined // true null === undefined // false
for in 当遍历对象时 只遍历对象自身的和继承的可枚举的属性。 会把.length也当做键值遍历出来