JavaScript 中的变量声明:var、let 还是 const?
我们来逐一了解一下。
简要概述
请访问我的博客查看原文:JavaScript 中的变量声明:var、let 还是 const?
JavaScript 中有 4 种变量声明方式。初学者通常会对不同方式的效果感到困惑。
因此,本文旨在帮助初学者了解 JavaScript 中声明变量的 4 种方法之间的区别以及何时使用它们。
我们来逐一了解一下。
1. “自由发挥”的方式(虽然可行,但强烈不推荐!)
myVariable = 'abc';在 JavaScript 中,你可以不使用任何关键字 ` var, let` 或 `, ` 来声明变量const。这仅仅意味着你创建了一个全局变量。
在 Node 环境下,我们运行以下代码片段。
a = "test";
console.log(a);
// output: test
结果显示test有效!
但是,如果我们要'use strict'进入严格模式,则这种声明方法是被禁止的。
"use strict";
a = "test";
console.log(a); // ReferenceError: a is not defined
出现错误。ReferenceError: a is not defined
强烈不建议使用此方法,因为它在严格模式下是被禁止的,而且会污染全局环境。如果全局环境包含过多无用的临时变量,程序很可能会遇到无法预料的错误,调试起来也会非常困难。
所以,千万不要使用这种方法。
2. 变量
var`{}` 是 JavaScript 中声明变量最常用的方法。在 ES6 发布之前,你应该始终使用 `{}`var来声明变量。
然而,var它也存在局限性,因为用它声明的变量var是在函数级别声明的。
这是什么意思?请看下面的例子。
"use strict";
function test() {
for (var i = 0; i < 10; i++) {
var count = i;
}
console.log(count);
}
test();
// Output: 9
在运行这段代码之前,你期望函数输出什么?抛出错误吗?你可能会认为它count在 for 循环内部声明,不应该在循环外部访问。
但是抱歉,如果您使用 `for`var循环声明一个变量,该变量就属于函数作用域,这意味着即使count它是在 `for` 循环内声明的,它count仍然属于test()该函数。因此,只要它在test()函数内部,count就可以访问!
另一个证据是,即使你console.log(count)在函数内部声明它之前就抛出了错误,也不会抛出任何错误!由于没有抛出错误,因此很难追踪意外错误发生的时间。
"use strict";
function test() {
console.log(count); // runs before declaration
for (var i = 0; i < 10; i++) {
var count = i;
}
}
test();
// Output: undefined
输出结果显示正常,而不是抛出错误!相反,如果根本没有声明undefined该变量,则会抛出错误!count
"use strict";
function test() {
console.log(count); // error is thrown
}
test();
3. 让
let在ES6中引入。它的作用域是块级的,这解决了使用时可能遇到的困难var。
通过使用let以下代码片段,可以正确地抛出错误。ReferenceError: count is not defined
"use strict";
function test() {
for (let i = 0; i < 10; i++) {
let count = i;
}
console.log(count); // ReferenceError: count is not defined
}
test();
这是因为这样let会使count变量变为块级作用域。count它只存在于这个 for 循环中。这是声明变量时更好的方法。
然而,它也有缺点。let它与 IE 11 等旧版浏览器不兼容。如果您直接编写用于浏览器显示的 JavaScript 代码(未经 Babel 编译),并且需要兼顾使用旧版浏览器的用户,则应考虑使用其他方法,var因为不兼容的 JavaScript代码let很可能会导致旧版浏览器出现问题,并在发生错误时停止网页渲染。
4. 常量
constES6 中也引入了 `var` 变量。与 `var` 一样let,它的作用域也限定在代码块级别。唯一的区别是,` constvar` 变量是一个常量,其值不能更改。
"use strict";
const a = 1;
a = 2;
上述代码片段会抛出错误。TypeError: Assignment to constant variable.
此外,如果您处理的是数组或对象,完全可以使用常量声明,但稍后可以修改其属性或成员。请看以下代码片段:
"use strict";
const a = [];
const b = {};
a.push(1);
b.key = 2;
console.log("a", a);
console.log("b", b);
// output:
// a [ 1 ]
// b { key: 2 }
没有发生错误。这是因为常量值a和是它们在内存中的地址,而不是它们的成员或属性。如果我们像下面这样将b的地址赋值给,就会发生错误。ab
"use strict";
const a = [];
const b = {};
a = b; // TypeError: Assignment to constant variable.
因此,只要您不指向a其他b位置,就不会发生错误。
建议这样做,以确保您操作的是正确的对象/数组实例。
简要概述
声明变量时,绝对不能省略逗号var、let逗号或const感叹号!
此外,var除非你真的需要考虑浏览器兼容性问题,否则也应该避免这样做。
最佳实践是,您应该始终考虑使用 `__new__` 声明变量const。默认
使用const`__new__` 可以帮助您避免不必要的错误,例如随意地重新赋值给重要变量。除非您确定以后会更改其值,否则不应使用 `__new__`。在这种情况下,第二个选项应该是 `__new__` let。