01-let和const
    // let 和 const 是ES2015 新增的两个关键字
    // 它们的作用是创建变量
    // 它们创建的变量是块级作用域
    // 块级作用域 块(block) 指的是 花括号{ } if else while do-while for …
    // 全局作用域 任何位置可以访问
    // 函数作用域 仅在函数中有效
    // var 关键字
    // var 创建的变量 为 全局 和 函数作用域
    // 在预编译阶段 var 所创建对象 会自动提前到当前作用域的顶部 将变量赋值为 undefined
    // 使用var 创建的全局变量 和 window进行自动绑定 自动成为了window的子属性
    // 现在开始 废弃使用var关键字
    // 应为var存在很多不合理之处
    // 取代var关键字的 就是 let 和 const
    // 1. let 和 const 所声明的变量 不会和 window进行绑定
    // 2. let 和 const 变量声明在预编译阶段 不会进行声明提前(需要在声明后进行使用)
    // 3. let 和 const 声明的变量是块级作用域
    // 4. let 和 const 声明的变量 不能重复声明
    // 在for语句中 有一个特殊情况 设置循环的这个小括号 和 大括号是一个父子级作用域
    // 这里有两个作用域 小括号是大括号的 父级作用域
    // for (let i = 0; i < 10; i++) {
    // let i = 3;
    // console.log(i);
    // }
    // 暂时性死区
    // 只要块级作用域中 存在 let 和 const的命名 它所声明的变量就会绑定这个区域 不受外部影响
    // let a = 10;
    // if (true) {
    // console.log(a);
    // let a = 3;
    // console.log(a);
    // }
    // const 关键字
    // const 声明的变量是不允许改变的
    // const 也叫做常量声明 常量的值是无法改变的
    // const 必须在声明时进行赋值
    // 引用数据类型的存储 推荐使用关键字 const
    // 使用原则 能用const的地方 绝对不用let
    // 引用数据类型
    // 值存在堆内层 而在栈内层存储的是 地址
    // const 判断数据是否改变 判断的是栈中数据
    // 只要地址不变 属性随便修改

    02-变量的解构和赋值
    // ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构
    // 解构赋值
    // 1. 变量声明
    // 2. 赋值
    // 3. 从…中提取数据(解构)
    // let [a, b, c] = [1, 2, 3];
    // 声明了三个变量 a,b,c
    // 左边的中括号是因为 三个变量是从数组中提取值
    // 这个写法相当于 以下代码
    // let a = 1;
    // let b = 2;
    // let c = 3;
    // let arr = [1,2,3]
    // let a = arr[0];
    // let b = arr[1];
    // let c = arr[2];
    // … 剩余运算符
    // 剩余运算符 返回一个数组
    // 剩余运算符 必须出现在最后
    // 剩余运算符 如果没有成功解构到数据 则返回空数组
    // let [a, b, …c] = [1, 2, 3, 4, 5, 6, 7, 8];
    // console.log(a, b, c);
    // function fn(a, …b) { // 剩余参数(rest 参数)
    // console.log(a);
    // console.log(b);
    // }
    // // fn(‘a’, ‘b’, ‘c’, ‘d’);
    // fn(…[1, 2, 3, 4, 5]); // 展开