let

var和let声明变量的区别:

  • let声明的变量是块级变量,只存在{}内。
1
2
3
4
if(true){
let a=0;
}
console.log(a);

会出现Uncaught ReferenceError: a is not defined的报错,而在{}内打印console.log(a)而不会报错。

  • let声明的变量没有变量提升
1
2
console.log(a);
let a=0;

如上代码会报错Uncaught ReferenceError: Cannot access 'a' before initialization

  • let声明的变量会出现暂时死区

在{}外用var声明变量,{}内用let声明一个相同的变量,{}外用var声明的变量便没有意义。

1
2
3
4
5
var a=10;
if(true){
console.log(a);
let a=20;
}

如上代码依旧会报错Uncaught ReferenceError: Cannot access 'a' before initialization

const

  • 具有块级作用域
1
2
3
4
 if (true) { 
const a = 10;
}
console.log(a) // a is not defined
  • 声明变量要赋值
1
const PI;

未初始化会报错Uncaught SyntaxError: Missing initializer in const declaration

  • 常量赋值后,简单数据类型值不能修改,复杂数据类型地址不能更改。
1
2
3
4
const a = [];
a.push('Hello'); // 可执行
a.length = 0; // 可执行
a = ['Dave']; // 报错

解构赋值

数组结构

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

对象结构

1
2
3
4
5
6
7
let obj={
name:'panghu',
age:20
};
let {name,age}=obj;
console.log(name); //panghu
console.log(age); //20

箭头函数=>

1
2
3
4
5
const sum=(n1,n2)=>{ 
n1+n2;
}
const result=sum(10,20);
console.log(result);

当键头后的{}内只有一个表达式,可去掉{};当()里的参数只有一个,可去掉()。

1
2
3
const al=v=>alert(v) //al是函数名,v是函数形参
const result=al(20)
console.log(result);

剩余参数

1
2
3
4
5
sum=(a,...b)=>{
console.log(a); //3
console.log(b); //[4,5]
}
sum(3,4,5);
1
2
3
4
let students = ['胖虎', '张三', '李四'];
let [s1, ...s2] = students;
console.log(s1); // '胖虎'
console.log(s2); // ['张三', '李四']