1. let
- 没有预解析(和var不一样没有先定义再执行的功能,如果先执行会报错,即: let 是直接进行定义并且执行)
// console.log(a); //没有预解析(和var不一样没有想定义在执行的功能,如果向执行会报错)
let a = 1;
- 不能重复声明(不能let a两次,而var是可以的(前面一个覆盖后面一个)
let a = 1;
// let a = '重复定义会报错';
- 只作用于当前作用域(即: {} 就是一个作用域)
{
let a = 1
}
console.log(a) // 无法获取作用域中使用let定义的变量
{
var a = 1
}
console.log(a) // 可以获取作用域中使用var定义的变量
// 如果用let定义i 那么遇到{}就是作用域(相当于闭包,且let只作用于当前作用域),那么它会弹出1,2,3;
for (let i = 0; i < 3; i++) {
setTimeout(function () {
console.log(i); // 结果 1, 2, 3
}, 100)
}
// 因为使用 var 定义 i 就是定义了 一个全局变量 i ,所以计时器中拿到的结果都是 3
for (var i = 0; i < 3; i++) {
setTimeout(function () {
console.log(i); // 结果三个 3
}, 100)
}
2. const -> 常量
- 和 let 一样 没有预解析 不能重复声明 只作用于当前作用域
- 固定值不能被修改
const c = '固定值不能被修改';
// c = 2; // const常量定义 固定值不能被修改
- 数组里面的值允许被修改
const arr = [1, 2, 3];
arr.push(4);
console.log(arr) // [1, 2, 3, 4]
- 对象里面的值允许被修改
const obj = {
a: 1
};
obj.a = '对象里面的值允许被修改';
console.log(obj.a); // 对象里面的值允许被修改