1 let声明变量

1.1 let会形成独立的作用域

// var没有独立的作用域,异步执行时值已经是3,所以会输出3,3,3
for (var i = 0; i < 3; i++) {
    setTimeout(() => console.log(i))
}
// let 会形成独立的作用域,会输出0,1,2
for (let i = 0; i < 3; i++) {
    setTimeout(() => console.log(i))
}

1.2 不允许变量提升

1.3 不允许定义重复变量

2 解构赋值

结构上要对应

2.1 数组解构

  1. 数组结构需要[]将变量包裹

2.2.1 正常解构

let arr = [1, 2, 3]
let [a, b, c] = arr
console.log(a, b, c); // 1 2 3

2.2.2 缺省解构

1 只解构前部分
let arr = [1, 2, 3]
let [a, b] = arr
console.log(a, b); // 1 2
2 逗号分隔
let arr = [1, 2, 3]
let [a, , c] = arr
console.log(a, c); // 1 3
3 省略号
[a, b, c, ...rest] = [100, 200, 300, 400, 500];
console.log(rest);	//	[400, 500]

2.2 对象解构

2.2.1 名称相同解构

let { name, age } = { name: "Aeroxian, age: 25 }
console.log(name, age) // Aeroxian 25
{ a, b, ...rest} = { a: 100, b: 200, c: 300, d: 400, e: 500 }
console.log(rest)	//	{c: 300, d: 400, e: 500}
const person = {
  name: 'John Doe',
  age: 32,
  city: 'Miami',
  gender: 'Male',
  sayHello: function(){
    console.log('Hello');
  }
}

const { name, age, city, sayHello } = person;
sayHello()

2.2.2 别名解构

let { name: nameAlias, age: ageAlias } = { name: "Aeroxian", age: 25 }
console.log(nameAlias, ageAlias) // Aeroxian 25

2.2.3 默认解构

let { name, school = "CAU" } = { name: "Aeroxian", age: 25 }
console.log(name, school) // Aeroxian CAU
1 默认解构在函数形参中应用
function fn({ method = "GET", data }) {
    console.log(method, data);
}

fn({ data: "Order1" }) // GET Order1
fn({ method: "POST", data: "Order2" }) // // POST Order2

3 展开运算符

3.1 数组展开

let arr1 = [1, 2], arr2 = [3, 4]
//  [1, 2, 3, 4]
let arr3 = [...arr1, ...arr2]

3.2 对象展开

let person = { name: "Aeroxian", age: 25 },
    pos = { school: "CAU", city: "Beijing" };
// {name: "Aeroxian", age: 25, school: "CAU", city: "Beijing"}
let result = { ...person, ...pos };

3.3 剩余运算符(区别)

  1. 这里不是展开运算符
  2. 而是剩余运算符
function fn(param, ...num) {
    console.log(param, num);
}
// 1 [2,3]
fn(1, 2, 3)