写点什么

ES6 之 let、const 与 var

作者:木偶
  • 2022-10-22
    陕西
  • 本文字数:2157 字

    阅读完需:约 7 分钟

ES6之let、const与var

在进行变量声明的时候我们一般使用的是var,但是在 ES6 中新增的语法中有了letconst,今天我们来看看它们的区别。




一.为什么使用 ES6?



每一次标准的诞生都意味着语言的完善,功能的加强。JavaScript语言本身也有一些令人不满意的地方。


  • 变量提升特性增加了程序运行时的不可预测性;

  • 语法过于松散,实现相同的功能,不同的人可能会写出不同的代码;


所以在 ES6 中进行了新增的变量letconst;

二.let



let允许你声明一个作用域被限制在 块级中的变量、语句或者表达式。与 var 关键字不同的是, var声明的变量只能是全局或者整个函数块的。 varlet 的不同之处在于后者是在编译时才初始化。

1.作用域



let声明的只在一个块级中有效,与var不同,var是在整个封闭函数中有效:


if (true) {    let num1 = 20;    var num2 = 20;}console.log(num2); //20console.log(num1); // Uncaught ReferenceError: num1 is not defined
复制代码


结果已经很明显了,我们var声明的变量可以进行访问到,但是let却无法来进行访问到,反而会进行报错;


在程序和方法的最顶端,let不像 var 一样,let不会在全局对象里新建一个属性。比如:位于函数或代码顶部的var声明会给全局对象新增属性, 而let不会。


 var b = '您好'; let a = '您好'; console.log(this.a); //undefined console.log(this.b); //您好
复制代码

2.不存在变量提升



在前面所遇到的 var 进行声明变量时经常会遇到变量提升的问题,但是 let 不会进行变量提升;


var变量提升


if (true) {   console.log(num2);   var num2 = 20;}//输出undefined
复制代码


let不会进行变量提升


if (true) {    console.log(num2);    let num2 = 20;}//输出//Uncaught ReferenceError: Cannot access 'num2' before initialization
复制代码

3.暂存死区



暂时性死区:(利用let声明的变量会绑定在这个块级作用域,不会受外界的影响),普通的var在外面的声明会影响到在块级里面的变量值;


var影响


var num2 = 20;  if (true) {      console.log(num2);      var num2 = 20;  } //输出 20
复制代码


let暂存死区


var num2 = 20;  if (true) {      console.log(num2);      var num2 = 20;  } //输出 // Uncaught ReferenceError: Cannot access 'num2' before initialization
复制代码

4.重复声明变量问题



let:在同一个函数或块作用域中重复声明同一个变量会引起SyntaxError


var:重复声明问题


if (true) {    var num2 = 20;    var num2 = 20;    console.log(num2); //20}
复制代码


let:重复声明


if (true) {    let num2 = 20;    let num2 = 20;    console.log(num2);    //Uncaught SyntaxError: Identifier 'num2' has already been declared}
复制代码

5.总结



  • let关键字就是用来声明变量的;

  • 使用let关键字声明的变量具有块级作用域;

  • 在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的;

  • 防止循环变量变成全局变量;

  • 使用let关键字声明的变量没有变量提升;

  • 使用let关键字声明的变量具有暂时性死区特性;

三.const


1.定义



常量是块级范围的,非常类似用 let 语句定义的变量。但常量的值是无法(通过重新赋值)改变的,也不能被重新声明。<br>创建一个常量,其作用域可以是全局或本地声明的块。 与var变量不同,全局常量不会变为 window 对象的属性。需要一个常数的初始化器;也就是说,您必须在声明的同一语句中指定它的值(这是有道理的,因为以后不能更改)。<br>const声明创建一个值的只读引用。但这并不意味着它所持有的值是不可变的,只是变量标识符不能重新分配。例如,在引用内容是对象的情况下,这意味着可以改变对象的内容(例如,其参数)。<br>关于“暂存死区”的所有讨论都适用于letconst。<br>一个常量不能和它所在作用域内的其他变量或函数拥有相同的名称。

2.块级作用域



constlet大差不差在块级中有效存在


const count = 10;if (true) {    var count = 20;    console.log(count);    // Uncaught SyntaxError: Identifier 'count' has already been declared    let count = 20;    console.log(count);    //20}console.log(count); //10
复制代码

3.赋予初始值



在声明后必须赋予其一个初始值,因为它是不能修改的。


const num2;console.log(num2);//Uncaught SyntaxError: Missing initializer in const declaration
复制代码

4.常量不可以修改



常量不可以修改指的是我们不能再次去通过名称来进行对其赋值,但是其中的值可以进行修改,也就是说其引用内容可以进行修改;


const num2 = [1, 2, 3, 4, 5];num2 = [2, 3, 4, 5, 6];console.log(num2);//Uncaught TypeError: Assignment to constant variable.
复制代码


很明显的验证了其变量不可以被修改,那么我们可以来采用一些方法进行修改它的值,例如:


const num2 = [1, 2, 3, 4, 5];num2.push(6); //[1,2,3,4,5,6]num2.pop(); //[1,2,3,4,5]num2[0] = 10; //[10,2,3,4,5]console.log(num2);
复制代码

5.总结



  • const声明的变量是一个常量;<br>

  • 既然是常量不能重新进行赋值,如果是基本数据类型,不能更改值,如果是复杂数据类型,不能更改地址值;<br>

  • 声明 const时候必须要给定值;<br>

四.区别



  • 使用 var 声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象;<br>

  • 使用 let 声明的变量,其作用域为该语句所在的代码块内,不存在变量提升;<br>

  • 使用 const 声明的是常量,在后面出现的代码中不能再修改该常量的值;<br>如图所示:




发布于: 刚刚阅读数: 5
用户头像

木偶

关注

凭时间赢来的东西,时间肯定会为之作证 2022-10-21 加入

CSDN前端领域优质创作者,CSDN博客专家,擅长PC端以及Uniapp开发

评论

发布
暂无评论
ES6之let、const与var_JavaScript_木偶_InfoQ写作社区