ES6

let const

var

  • 污染全局变量
  • 导致变量提升
  • 可以被重复声明

let

  • 块级作用域
  • 可以解决重复定义问题

const

常量 不会变的量 (地址不变即可)

const obj = {name: 1}
obj = {name: 2} // 只是改变常量的内容,没有改变常量的地址和大小

... 展开运算符

  • 合并数组
let arr1 = [1,2,3]
let arr2 = [4,5,6]
let arr3 = [...arr1, ...arr2]
  • 深拷贝 浅拷贝
let school = {name: 'zfpx'}
let my = {age: {count: 18}, name: 'jw'} // 里面的count是个对象,是个指针,存放的是个地址
// 把原来的my放在新对象里,用一个新的age把原来的age也拷贝一份
let newMy = {...my, age: {...my.age}}
let all = {...schooll, ...newMy} // 这里的age是18 深拷贝的实现
my.age.count = 100

// 自己实现一个深拷贝的方法
// 掌握类型判断 typeof instanceof object.prototype.toString.call() constructor

function deepClone(obj) {// 判断obj是null还是undefined
    if (obj==null) return obj
    // 不是对象就不用拷贝了
    if (obj instanceof Date) return new Date(obj)
    if (obj instanceof RegExp) return new RegExp(obj)
    if (typeof !== 'object') return obj
    // 剩下的是数组或者对象
    let cloneObj= new obj.constructor
    // 用for in 来遍历数组和对象
    for (let key in obj) { // 实现深拷贝
        if(obj.hasOwnProperty(key)) { // 遍历私有属性
            cloneObj[key] = deepClone(obj[key])
        }
    }
    return cloneObj
}
deepClone()

set / map 是两种存储解构

set 集合 不能重复的东西,放了,就白放了,去重

let s = new Set([1,2,3,4])
typeof s // set
// 基础数据类型 string number boolean undefined object 私有,bol
  • 添加和删除 并且没有顺序
s.add('5') // 增加
s.delete('5') // 删除
s.values()
  • 集合 并集 交集 差集
let s01 = [1,2,3,1,2]
let s02 = [3,4,5,1,2]

// 并集
function union() {
    let s1 = new Set(s01)
    let s2 = new Set(s02)
    console.log([...new Set([...s1,...s2])])
}
// 交集
function intersection() {
   return [...new Set(s01)].filter(v => new Set(s02).has(v))
}

// 差集
function diff() {
   return [...new Set(s01)].filter(v => !new Set(s02).has(v)) // 取出相差的部分留下来
}

map

map 是有key的,不能放重复

let m = new Map()
m.set('name', 'zfjg')
m.set('name', '124')
let obj = {name: 1}
m.set(obj, '456') // 这个obj的引用空间被set所引用
obj = null // 把obj清空 这个空间还是在的
console.log(obj) // null
console.log(m) // {name =>'123', {name:1} => '456'}

weakMap 弱链接 map的区别 回收机制

  • WeakMap 弱链接集合 的key 必须是对象类型
// 修改深拷贝代码 解决循环引用问题
function deepClone(obj, hash=new Map()) {// 判断obj是null还是undefined
    if (obj==null) return obj
    // 不是对象就不用拷贝了
    if (obj instanceof Date) return new Date(obj)
    if (obj instanceof RegExp) return new RegExp(obj)
    if (typeof !== 'object') return obj
    if (hash.has(obj)) return hash.get(obj) // 如果weakMap中有对象就直接返回
    // 剩下的是数组或者对象
    let cloneObj= new obj.constructor
    // 如果是对象,把他放到weakMap中,如果再拷贝这个对象存在 就直接返回这个对象即可
    hash.set(obj, cloneObj)
    // 用for in 来遍历数组和对象
    for (let key in obj) { // 实现深拷贝
        if(obj.hasOwnProperty(key)) { // 遍历私有属性
            cloneObj[key] = deepClone(obj[key], hash)
        }
    }
    return cloneObj
}
deepClone()

object.defineProperty es5 vue

// 通过object.defineProperty定义属性,可以增加拦截器

你可能感兴趣的:(ES6)