JavaScript let 和 const

为什么需要新的声明方式

ES6 之前只有 var 一种声明方式,它存在变量提升、没有块级作用域、可以重复声明等问题,容易写出隐蔽的 bug。ES6 新增了 let(声明变量)与 const(声明常量),规则更严格、更符合直觉,如今已是主流写法。

var 的典型问题

var 的声明会被"提升"到作用域顶部,而且可以重复声明:

console.log(a); // 输出:undefined(声明被提升,但不报错)
var a = 1;

var b = 1;
var b = 2;      // 不报错,重复声明直接覆盖
console.log(b); // 输出:2

let 具备块级作用域

用 {} 包裹的代码块内部用 let 声明的变量,外部访问不到:

{
    let x = 10;
    var y = 20;
}
console.log(y);   // 输出:20
// console.log(x); // 报错:x is not defined

if、for、while 的花括号同样构成块级作用域,所以 for 循环里用 let 声明计数器最安全。

let 先声明后使用

let 声明的变量在声明之前访问会抛错(处于"暂时性死区"):

// console.log(n); // 报错:Cannot access 'n' before initialization
let n = 5;
console.log(n); // 输出:5

const 声明常量

const 声明时必须立刻赋值,之后不能再重新赋值:

const PI = 3.14159;
console.log(PI); // 输出:3.14159
// PI = 3;       // 报错:Assignment to constant variable

注意:const 禁止的是"改变引用",对象内部的属性仍可修改:

const user = { name: "小明" };
user.name = "小红";      // 合法:改属性不会改变引用
console.log(user.name);  // 输出:小红
// user = {};           // 报错:不能重新赋值

如何选择:const 优先

推荐原则:默认用 const,只有确实需要重新赋值时才用 let,尽量不用 var。因为"不该变却变了"比"忘了变"更容易出 bug,const 能在报错层面就帮你兜住:

const items = [1, 2, 3]; // 数组整体不会替换,用 const 安全
for (let i = 0; i < items.length; i++) {
    console.log(items[i]); // 输出:1 2 3
}

小结

let 修好了 var 在块级作用域与重复声明上的缺陷,const 进一步保证引用不被改变。实际开发按"const 优先、必要时用 let、放弃 var"的原则写,代码会清晰可靠很多。

笔记加载中…