Skip to content

ES6


let、const、var的区别

区别varletconst
是否有块级作用域×✔️✔️
是否存在变量提升✔️××
是否添加全局属性✔️××
能否重复声明变量✔️××
是否存在暂时性死区×✔️✔️
是否必须设置初始值××✔️
能否改变指针指向✔️✔️×

const对象的属性可以修改吗?可以的。const只是保证这个变量指向的内存地址不能修改。

var:无块级作用域,可重复声明,创建和初始化提升,挂载在windows上。

let:有块级作用域,不可重复声明,创建被提升但初始化不会提升,暂时性死区。

const:和let唯一的区别就是值不可修改。

箭头函数

特点:(更加简洁)

  • 如果只有一个参数,可以不写参数的括号
  • 如果返回值只有一句话,可以省略大括号,不用写return
  • 如果函数体不需要返回值,且只有一句话,可以用void关键字替代大括号,最常见的场景就是调用一个函数

箭头函数没有自己的this

  • 箭头函数在定义时就确定了this指向,之后也不会改变,this指向作用域的上一层

  • call、apply、bind也无法改变箭头函数的this指向

  • 箭头函数不能作为构造函数使用。new一个箭头函数无法执行,new操作符的实现:1. 创建一个对象 2.将构造函数的作用域赋给新对象 3.指向构造函数中的代码,构造函数的this指向改对象 4.返回新对象。箭头函数无法改变this指向,所以无法执行2、3

    javascript
    function myNew(Fn, ...args) {
      // 1.创建一个空对象,继承构造函数的prototype属性
      const object = Object.create(Fn.prototype);
      // 2.指向构造函数
      const result = Fn.call(object, ...args);
      // 3.如果返回结果是对象,直接返回,否则返回默认this对象
      return result instanceof Object ? result : object
    }
  • 箭头函数没有prototype

  • 箭头函数没有自己的arguments

  • 箭头函数不能作为Generator函数

其他新特性:

  • 扩展运算符
  • 模板字符串
  • Proxy

Map和WeakMap:

共同点:都是键值对的集合,api类似,都有set、get、has、delete

区别:

  • Map可以通过size获取数量,通过clear清除所有成员,WeakMap的clear方法已经被移除了,如果清除的话,只能通过创建一个空的WeakMap替换原对象
  • WeakMap的key只能是对象。所引用的对象都是弱引用,一旦引用的对象的其他引用贝壳清除了,垃圾回收就会释放对象的内存,不用删除引用。