https://es6.ruanyifeng.com/#docs/let
    let 不存在变量提升 var有
    let 有暂时性死区 必须先声明后使用 var 未声明时可以使用 值为undefined
    let 不允许重复声明
    let 块级作用域(大括号 {})块级作用域外访问不到

    const声明一个只读的常量
    const声明的变量不得改变值 声明就初始化 所以不能留到之后赋值 只声明不赋值 会报错
    const块级作用域内有效 暂时性死区
    const并不是变量的值不能改动 是指向的内存地址所保存的值不允许改变(简单类型的数据(数值、字符串、布尔值) 值就保存在知道的内存地址 故不能改变。复杂类型的数据(对象 数组)变量指向的内存地址保存的是一个指向实际数据的指针,const保证这个指针是固定的)

    let const class 声明的全局变量不属于顶级对象的属性

    es6声明变量的六种方法
    var function let const import class

    原始值 存在栈里面
    Number String Boolean undefined null
    引用值 栈中存的是指向堆的地址指针,值存在堆里
    Array Object Function

    声明方式 变量提升 暂时性死区 重复声明 块作用域有效 初始值 重新赋值
    var 不存在 允许 不是 非必须 允许
    let 不会 存在 不允许 非必须 允许
    const 不会 存在 不允许 必须 不允许