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]); // 展开