【译】ES6 中 的 var、let 和 const 应该如何选择?

Gran Magisterio
Feb 25, 2017 · 3 min read

原文链接: JavaScript ES6+: var, let, or const?

原文作者: Eric Elliott

译文出自: 掘金翻译计划

译者: Gran

校对者: Yaowenjie, zhangchen

通过学习让事情变得简单这个原则也许是成为更好的开发者途径中最重要的事。这意味着在标识符的上下文中单个标识符应该只被用来表示单一的概念。

有时候为了表示一些数据就很容易创建一个标识符,然后使用该标识符作为一个临时的空间去存储一些值作为一个过渡。

举个例子,你可能只为了得到 URL 中的 query string 的某个值,而先创建了一个标识符存储完整 URL ,然后是 query string ,最后才是该值。这种做法应该尽量避免。

如果你对 URL、 query string、 GET 参数的值分别使用不同的标识符,是很容易理解的。

这就是为什么在 ES6 上我喜欢 const 胜过 let 。在JavaScript中,const 意味着该标识符不能被重新赋值。不要被 immutable values 弄糊涂了。不像那些诸如 Immutable.js 与 Mori 产生的真正不可变的数据类型,const声明的对象可以有属性变化。

如果我不需要重新赋值,const 就是我的默认选择 相比 let 要常用的多,因为我想让它在代码中的使用尽可能的清晰。

当我后面需要给一个变量重新赋值时一般使用 let。因为我使用一个变量对应一个东西,现在 let 越来越多的被使用在循环和算法上面。

我在 ES6 中从不使用 var 。例如在一个 for 循环块范围值中,我想不出哪里使用 var 比使用 let 要好。

const 适用于赋值后不会再做修改的情况。

let 适用于赋值后还会修改的情况。例如循环计数,或者是一个算法的值交换过程。它同时标志着这个变量只能被用在所定义的块作用域之中,也就是说它并不总是包含在整个函数中。

var 现在是最坏的选择当你在 JavaScript 中定义一个变量时。 它在定义后可能还会修改,可能会在全局函数中使用,或者说只为块或循环。

警告:

现在在 ES6 中,因为 letconst 的暂时性死区效应,使用 typeof: 来检测标识符已经不再安全了。

译者注:在声明之前对标识符使用 typeof: ,会抛出 ReferenceError。

function foo () {
typeof bar;
let bar = ‘baz’;
}
foo(); // ReferenceError: can't access lexical declaration
// `bar' before initialization

但是不要紧只要你采用我的方法 “Programming JavaScript Applications”,在你使用它们之前进行标识符初始化。

P.S.

如果你需要通过清除它释放一个值,你可以考虑使用 let 而不是 const。如果你需要对垃圾回收进行微管理,你应该去看“Slay’n the Waste Monster”, 视频链接:

Gran1987

learning to be a giant.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade