ES6 中新增的 let 和 const 变量声明详解
在 ES6 之前,JavaScript 声明变量时只有 var 关键字,虽然可以声明全局变量和局部变量,但 var 存在着一些问题。比如变量作用域、变量提升和声明后重新赋值等问题。为了解决这些问题,ES6 中引入了 let 和 const 两种新的关键字。
let 声明变量
let 关键字用于声明一个块级作用域的变量。也就是说,在 let 声明的变量所在的 {} 内部,该变量就是一个局部变量。而在 {} 外部,该变量就无法访问。
示例代码:
{ let a = 3; } console.log(a); // Uncaught ReferenceError: a is not defined
在上面的代码中,我们声明了一个局部变量 a,然后在 {} 外部访问这个变量时就会报错。
除了作用域问题外,let 声明的变量还有一个特点,就是不能重复定义。也就是说,如果在当前作用域内已经定义了一个变量,就不能用 let 再次定义一个同名变量。
示例代码:
let a = 3; let a = 5; // Uncaught SyntaxError: Identifier 'a' has already been declared
在上面的代码中,我们先定义了一个变量 a,然后又用 let 定义了一个同名变量 a,就会报错。
const 声明常量
const 关键字用于声明一个只读常量。也就是说,在 const 声明的变量中,变量的值不可改变。这样可以防止程序中误改变量值而引起的 bug。
示例代码:
const a = 3; a = 5; // Uncaught TypeError: Assignment to constant variable.
在上面的代码中,我们用 const 声明了一个常量 a,然后尝试改变 a 的值时就会报错。
除了不可改变的特点,const 和 let 还有一个共同点,就是都不存在变量提升。也就是说,在代码块内部用 const 或 let 定义的变量,在代码块外部都是无法访问的。
需要注意的是,如果用 const 声明的变量是一个对象,那么这个对象本身是可以被改变的。只是对象的引用不能改变。
示例代码:
const obj = { a: 3 }; obj.a = 5; // 可以,将 obj.a 的值改为 5 obj = { a: 5 }; // Uncaught TypeError: Assignment to constant variable.
在上面的代码中,我们用 const 声明了一个变量 obj,然后尝试改变 obj 的属性 a 的值是可以的,但是尝试改变 obj 的引用就会报错。
总结
let 和 const 是 ES6 中新增的声明变量的关键字,let 用于声明一个块级作用域的变量,const 用于声明一个只读常量。两者都不存在变量提升,而且都不能重复定义。需要注意的是,const 声明的对象本身是可以被改变的,只是对象的引用不能改变。掌握这两个关键字的用法,能帮助我们更好地避免变量作用域和变量声明等问题,从而写出更加健壮、可靠的 JavaScript 代码。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646ae825968c7c53b0a5f139