一. let
相当于var,但所声明的变量只在let命令所在的代码块中有限
1. 变量不提升
- var 会进行变量提升(即没有声明就可以使用)
<script>
console.log(a); // undefined
var a = 10;
</script>
- let 如果在没有声明的时候使用,则系统会报错。
<script>
console.log(a); // 报错
let a = 10;
</script>
2.代码块有效
- let 只在代码块有效
- var 在全局有效
3. 不允许重复声明
- let 不允许在相同作用域中重复声明
{
let a = 10;
console.log(a); //10
}
{
let a = 10;
console.log(a); //报错
let a = 20;
console.log(a); //报错
}
4. 块级作用域
- 外层不受内层代码块影响
- 内层可以定义外层的同名变量
- 允许块级作用域任意嵌套
- 代替了立即执行函数的表达式
- 可在块级作用域声明函数,外层不可引用。
二. const
1. 声明一个只读的常量,在声明时必须赋值,且该值不可改变。
<script>
const a;
console.log(a); //报错
</script>
<script>
const a;
a = 10;
console.log(a); // 报错
</script>
<script>
const a = 10;
console.log(a); //10
a = 20;
console.log(a); //报错(不能给常量继续赋值)
</script>
2. 不提升,不可重复声明
<script>
console.log(a); // 报错
const a = 10;
</script>
<script>
const a = 10;
console.log(a); // 报错
const a = 20;
console.log(a); //报错
</script>
3. 注意: const 声明常量,但是如果是引用型的,即只是确定他的内存地址,里面可以修改,例如:数组,对象等
<script>
const a = [1,2,3,4];
console.log(a);
a.push(5);
console.log(a);
</script>
<script>
const obj = {
a: 10,
b: 50
}
console.log(obj);
obj.a = 123;
console.log(obj);
</script>