ES6

94 阅读3分钟

let const的使用

为什么要推出 let const

因为var的使用本身存在一些问题

使用var导致的问题

  1. 污染全局变量
  2. 存在变量提升问题。(function也存在变量提升问题)
  3. var可以被重复声明

let 和 const 对上述问题的解决

  1. let 和 const 只在当前作用域范围内生效(常见的作用域有全局作用域、函数作用域),不会将声明的变量挂载在window上。
  2. 不存在变量提升,所以会存在暂存死区的问题。
    let a = 100
    {
        console.log(a) // undefined 暂存死区
        let a = 200
    }
  1. 变量不能重复声明

const

  • 一般const声明常量,字母全大写。
  • 常量指的是地址不变的量,一个对象常量的属性可以改变,因为其地址没有发生变化。

...展开运算符

  • 把两个数组合成一个数组
    let arr1 = [1,2,3]
    let arr2 = [4,5,6]
    let arr3 = [...arr1,...arr2]
  • 把两个对象合成一个对象
    let name = {name:'ccc'}
    let age = {age:18}
    let person= {...name,...age}

该方法只能拷贝一层,是浅拷贝。

set , map 两种存储结构

set

  • set 不能重复,返回的值可迭代
  • set 具备一些增删改查的方法

用set 处理集合

let s1 = [1, 2, 3, 4, 6, 2, 3]
let s2 = [4, 5, 3, 2, 1]
  • 并集
function union(s1, s2) {
  let unionArr = [...new Set(s1), ...new Set(s2)]
  return [...new Set(unionArr)]
}
  • 交集
function intersection(s1, s2) {
  return [...new Set(s1)].filter(item => {
    return new Set(s2).has(item)
  })
}
  • 差集
function diff(s1,s2) {
  return [...new Set(s1)].filter(item => {
    return !new Set(s2).has(item)
  })
}

map

map是有key的,不能放重复的

map对象使用set()函数时,所引用的对象,即使该引用对象被清空,引用的空间还是存在的。

weakMap

weakMap的key必须是对象类型的

map有引用关系,不会销毁,会占用内存空间;weakMap没有引用关系,会销毁,不会占用内存空间。

箭头函数

  • 没有this
  • 没有arguments
  • 不会变量提升
  • 返回一个对象
let a = (x,y)=>({total:x+y})

数组的方法

es5的方法

forEach、reduce、map、filter、some、every

reduce

求和 , 将多个数据,最终变成了一个数据

// 自实现reduce
let arr = [1, 2, 3]
// 一个参数是函数,一个初始化的值(也是最终返回会的值)
// 函数的参数为  a数组的第一个值, b数组的第二个值, index当前值的索引, current当前数组
Array.prototype.reduce = function (callback, initData) {
  // 循环数组
  for (let i = 0;i<this.length;i++) {
    // console.log(i,initData,this)
    // 判断是否有初始的值 
    if (initData == undefined) {//初始无值
      initData = callback(this[i], this[i+1], i+1, this)
      i++
    } else {
      initData =  callback(initData, this[i], i, this)
    }
  } 
  return initData
};
let res = arr.reduce((a, b,index,arr) => a+b);
console.log(res)

es6的方法

find、findIndex

es7

includes

es6的类

每个实例的_proto_指向所属类的prototype(原型)

es6的规范里 如果单独调用原型上的方法 this是不存在的 undefined

类的装饰器

segmentfault.com/a/119000001…

装饰器是一个函数,不仅可以装饰类,还可以装饰方法的属性。

不可以装饰函数,因为函数存在变量提升

类的装饰器

装饰器是一个对类进行处理的函数。装饰器函数的第一个参数,就是所要装饰的目标类

注意,装饰器对类的行为的改变,是代码编译时发生的,而不是在运行时。这意味着,装饰器能在编译阶段运行代码。也就是说,装饰器本质就是编译时执行的函数

方法的装饰器

  • 装饰器第一个参数是 类的原型对象
  • 第二个参数是 所要装饰的属性名
  • 第三个参数是 该属性的描述对象