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);  // 对象里面的值允许被修改