let 和 const 命令

900 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

前言

相信只要是前端,就没有不知道这两个,var、let、const三者的区别是面试题常问问题,今天咱们就来了解下他们,话不多说,开干!

基本

let

概念:作用类似于 var用于定义变量,用let定义的变量具有块级作用域等特点 ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。

{
  let a = 10;
  var b = 1;
}

a // ReferenceError: a is not defined.
b // 1

上面代码在代码块之中,分别用letvar声明了两个变量。然后在代码块之外调用这两个变量,结果let声明的变量报错,var声明的变量返回了正确的值。这表明,let声明的变量只在它所在的代码块有效。

for循环的计数器,就很合适使用let命令。

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

console.log(i);
// ReferenceError: i is not defined

上面代码中,计数器i只在for循环体内有效,在循环体外引用就会报错。

特点:

   块级作用域

  不存在变量声明提升

  let变量会有声明提升,但是首先访问,需要赋值之后才能使用

   TDZ(暂时性死区)

   在有跟let变量同名的全局变量时,在let变量作用域下,会存在一块区域,两个变量都不能使用,这块区域就叫暂时性死区

 不能重复定义

  同作用域下不能重复定义同一个let变量,否则会报错
     

const

const声明一个只读的常量。一旦声明,常量的值就不能改变。

const PI = 3.1415;
PI // 3.1415

PI = 3;
// TypeError: Assignment to constant variable.

上面代码表明改变常量的值会报错。

const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。

const foo;
// SyntaxError: Missing initializer in const declaration

上面代码表示,对于const来说,只声明不赋值,就会报错。

const的作用域与let命令相同:只在声明所在的块级作用域内有效。

if (true) {
  const MAX = 5;
}

MAX // Uncaught ReferenceError: MAX is not defined

const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。

if (true) {
  console.log(MAX); // ReferenceError
  const MAX = 5;
}

上面代码在常量MAX声明之前就调用,结果报错。

const声明的常量,也与let一样不可重复声明。

var message = "Hello!";
let age = 25;

// 以下两行都会报错
const message = "Goodbye!";
const age = 30;

特点:

  具有let所有特点

  const变量一旦定义,变量不可修改

  不可修改是针对内存地址而言的,如果const变量是一个基本数据及(数字、字符串、布尔型),那么重复赋值会报错。但如果是数组、对象等复合数据,内部的变化const是允许的(比如说给数组 添加或修改数据),这个是可以的,但是不能赋于一个新的数组或对象。

var、const、let之间的联系和区别

  • 三者都是用来定义变量的。
  • letconst具有块级作用域、TDZ、不存在声明提升、不能重复定义等特点,而var没有以上特点,并且var是存在声明提升的。
  • letvar定义的变量是可以修改的,而const定义的变量是不可修改的。
  • 日常情况下,对于基本类型的数据(字符串、数学、布尔),用varlet。对于数组等建议使用const,当然要注意兼容性的问题。

结尾

这些都是js的基础,也是面试经常被问到的。我想大家应该已经很熟悉了。