Skip to content

let和const

ES6引入了letconst关键字,用于声明变量。它们与传统的var关键字相比,具有块级作用域、不存在变量提升、不能重复声明等特性,使得JavaScript的变量声明更加规范和安全。

let关键字

let的基本用法

let关键字用于声明变量,它具有以下特性:

  1. 块级作用域let声明的变量只在其所在的代码块内有效
  2. 不存在变量提升let声明的变量不会被提升到作用域的顶部
  3. 不能重复声明:在同一作用域内,不能重复声明同一个变量
  4. 暂存死区:在let声明变量之前,该变量不可用
javascript
// 块级作用域
if (true) {
  let x = 10;
  console.log(x); // 输出: 10
}
console.log(x); // 错误: x is not defined

// 不存在变量提升
console.log(y); // 错误: Cannot access 'y' before initialization
let y = 20;

// 不能重复声明
let z = 30;
let z = 40; // 错误: Identifier 'z' has already been declared

// 暂存死区
if (true) {
  console.log(a); // 错误: Cannot access 'a' before initialization
  let a = 50;
}

let与var的区别

特性letvar
作用域块级作用域函数作用域
变量提升不存在存在
重复声明不允许允许
暂存死区存在不存在
全局对象属性不会成为全局对象的属性会成为全局对象的属性
javascript
// 作用域
function test() {
  var varVariable = 'var';
  let letVariable = 'let';
  
  if (true) {
    var varVariable = 'var inside block';
    let letVariable = 'let inside block';
    console.log(varVariable); // 输出: var inside block
    console.log(letVariable); // 输出: let inside block
  }
  
  console.log(varVariable); // 输出: var inside block
  console.log(letVariable); // 输出: let
}

test();

// 全局对象属性
var globalVar = 'global var';
let globalLet = 'global let';

console.log(window.globalVar); // 输出: global var
console.log(window.globalLet); // 输出: undefined

const关键字

const的基本用法

const关键字用于声明常量,它具有以下特性:

  1. 块级作用域const声明的常量只在其所在的代码块内有效
  2. 不存在变量提升const声明的常量不会被提升到作用域的顶部
  3. 不能重复声明:在同一作用域内,不能重复声明同一个常量
  4. 暂存死区:在const声明常量之前,该常量不可用
  5. 不能修改const声明的常量一旦被赋值,就不能再修改
javascript
// 块级作用域
if (true) {
  const PI = 3.14159;
  console.log(PI); // 输出: 3.14159
}
console.log(PI); // 错误: PI is not defined

// 不存在变量提升
console.log(MAX); // 错误: Cannot access 'MAX' before initialization
const MAX = 100;

// 不能重复声明
const MIN = 0;
const MIN = -100; // 错误: Identifier 'MIN' has already been declared

// 暂存死区
if (true) {
  console.log(COLOR); // 错误: Cannot access 'COLOR' before initialization
  const COLOR = 'red';
}

// 不能修改
const NAME = 'John';
NAME = 'Jane'; // 错误: Assignment to constant variable

const与对象

需要注意的是,const声明的常量如果是对象,那么对象本身不能被重新赋值,但对象的属性可以被修改:

javascript
const person = {
  name: 'John',
  age: 30
};

// 不能重新赋值整个对象
person = { name: 'Jane', age: 25 }; // 错误: Assignment to constant variable

// 但可以修改对象的属性
person.name = 'Jane';
person.age = 25;
console.log(person); // 输出: { name: 'Jane', age: 25 }

const与数组

同样,const声明的常量如果是数组,那么数组本身不能被重新赋值,但数组的元素可以被修改:

javascript
const numbers = [1, 2, 3];

// 不能重新赋值整个数组
numbers = [4, 5, 6]; // 错误: Assignment to constant variable

// 但可以修改数组的元素
numbers[0] = 4;
numbers.push(4);
console.log(numbers); // 输出: [4, 2, 3, 4]

最佳实践

什么时候使用let?

当变量的值需要被修改时,使用let关键字:

javascript
let count = 0;
count = 1;
console.log(count); // 输出: 1

for (let i = 0; i < 10; i++) {
  console.log(i);
}

什么时候使用const?

当变量的值不需要被修改时,使用const关键字:

javascript
const PI = 3.14159;
const name = 'John';
const person = {
  name: 'John',
  age: 30
};

为什么优先使用const?

  1. 代码可读性:使用const声明的变量,其值不会被修改,这使得代码更加清晰易读
  2. 代码安全性:使用const声明的变量,其值不会被意外修改,这减少了错误的发生
  3. 性能优化:JavaScript引擎可以对const声明的变量进行优化

面试常见问题

1. let、const和var的区别是什么?

特性letconstvar
作用域块级作用域块级作用域函数作用域
变量提升不存在不存在存在
重复声明不允许不允许允许
暂存死区存在存在不存在
全局对象属性不会成为全局对象的属性不会成为全局对象的属性会成为全局对象的属性
值可修改可以不可以可以

2. 什么是块级作用域?

块级作用域是指变量只在其所在的代码块内有效,代码块可以是{}if语句、for循环、while循环等。ES6引入的letconst关键字都具有块级作用域。

3. 什么是暂存死区?

暂存死区是指在letconst声明变量之前,该变量不可用的区域。在暂存死区内,访问该变量会抛出错误。

4. const声明的对象可以修改吗?

const声明的对象本身不能被重新赋值,但对象的属性可以被修改。这是因为const只保证变量的引用不变,而不保证引用的对象不变。

5. 为什么优先使用const?

  • 代码可读性:使用const声明的变量,其值不会被修改,这使得代码更加清晰易读
  • 代码安全性:使用const声明的变量,其值不会被意外修改,这减少了错误的发生
  • 性能优化:JavaScript引擎可以对const声明的变量进行优化

总结

letconst是ES6引入的新关键字,它们具有块级作用域、不存在变量提升、不能重复声明等特性,使得JavaScript的变量声明更加规范和安全。在实际开发中,我们应该优先使用const,只有当变量的值需要被修改时,才使用let

好好学习,天天向上