ES6之let、var、const声明的区别

176 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情  1b1882ba6eb785818e96e5c7263b28e.jpg

前言

变量的声明在每个编程语言里都会有,es5 中声明变量仅能使用 var , es6后新增了 let 和 const。其中,var 和 let 表示声明变量,const 表示声明常量。

1、基本使用

  • let:let 声明的变量只在 let 声明的代码块中有效, 直观上与 var 使用一致
  • const:全拼constant常量的意思,一经声明不可以更改,但是引用类型可以修改数据内部结构(Array, Object)

2、命名方式

   var:
        var name;
        var age, id;
        var birthplace = '北京';
        var sex = '男', height = 170, hobby = [];
   let:
        同 var
   const:
        const SCHOOL = '北大'
    

3、变量let var的区别

3.1、let 变量不能重复声明

   let star = '1';
   let star = '2'; 
  • (1)let:报错,表示已经声明
  • (2)var:正常,star等于2

3.2、let不存在变量提升

   console.log(song);
   let song = '恋爱达人'
  • let:报错,表示未初始化前无法访问
  • var:正常,song等于undefined,原因是变量提前以 var 的方式进行了声明

3.3、let声明的变量属于块级作用域

  • 什么是块级作用域:ES6 中新增了块级作用域,由一对大括号包裹形成的作用域就是块级作用域。(ps: if else while for)
  • var 声明的变量属于函数作用域;let 属于块级作用域
   {
       let girl = '高圆圆'
   }
   console.log(girl);
  • let:报错,表示没有找到girl这个变量(也体现在if else while for上)
  • var:正常,打印高圆圆
  • let 之所以会报错,是因为 let 声明的是块级作用域,只在相应的区块内有效,离开就没有权限访问了,{ } 就是一个区块,输出是在外部输出,所以访问不到,便报错了。

3.4、let不会全局环境声明

(1)在全局环境中声明变量,var声明会成为window的属性或方法,let不会

   var str1 = 'a';
   let str2 = 'b'
   console.log(window.str1,window.str2); 
  • let:输出 undefined
  • var:输出 'a'

3.5、var 会造成意想不到的全局污染

举例一

   for (var i = 1; i <= 10; i++) {
      setTimeout(function () {
          console.log(i)
      },1000)
   }

运行代码:程序输出了十次 11,与需求一秒之后分别输出 1 - 10的值不符,将 var 改成 let 则恢复正常

举例二

   let lists = document.getElementsByClassName('li')

   for (let i = 0; i < lists.length; i++) {
        lists[i].onclick = function() {
            // 修改颜色
            items[i].style.background = 'red'

        }
    }

需求:点击 li 让颜色变成 red

运行代码: 如果 i 使用的是let,三个 i 互不影响,如 i 使用的是var 的话 会报错,因为 i 已经变成 lists.length + 1 了

4、const

  • const 一定要有初始值
  • 一般用大写来命名常量,如:const SCHOOL = '北大'
  • 常量的值不能被修改,引用类型除外
  • 与 let 一样是块级作用域

5、总结

  1. 为了安全,大部分情况下 var 都可以用 let 替代,尤其是 for 循环中定义循环变量,使用let可以避免变量污染
  2. 定义常量在大多数情况下应使用 const,这样有利于代码的阅读,不用考虑这个变量会不会发生改变,还能提高程序的 潜在 执行效率。
  3. 大部分情况下都不应该使用 var 进行声明,因其全局破坏的影响,尽量使用 let 或 const 进行取缔。
  4. 有些老版本的浏览器还不兼容 let 和 const ,只能用var
  5. 在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。这在语法上,称为  “暂时性死区”