es6之变量声明

389 阅读3分钟

「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战

前言: let 和 const

ES2015(ES6)中 声明变量除了 var 多了 let 和const let 声明的变量只在 let 命令所在的代码块内有效。 const 声明一个只读的常量,一旦声明,常量的值就不能改变。

在 ES6 之前,JavaScript 只有两种作用域: 全局变量 与 函数内的局部变量。 es6 的letconst 多了块级作用域

let

  • 不会变量提升
  • 同作用域名不能重复声明
  • 暂时性死区
  • 块级作用域

循环作用域

使用 var 关键字:

例子

var i = 5;
for (var i = 0; i < 10; i++) {
    // 一些代码...
}
// 这里输出 i10

使用 let 关键字:

例子

let i = 5;
for (let i = 0; i < 10; i++) {
    // 一些代码...
}
// 这里输出 i 为 5

可以解决循环计数的问题

for (var i = 0; i < 10; i++) {
  setTimeout(function(){
    console.log(i);
  })
}
// 输出十个 10
for (let j = 0; j < 10; j++) {
  setTimeout(function(){
    console.log(j);
  })
}
// 输出 0123456789

const

  • 不会变量提升
  • 同作用域名不能重复声明
  • 暂时性死区
  • 块级作用域
  • const定义的变量无法修改

注意要点 const 的特殊的情况

  • const 对于简单类型(数值 number、字符串 string 、布尔值 boolean)是不可变的。
  • const 定义的复杂类型(对象 object,数组 array,函数 function),由于常量定义的是内存的指针或者内容地址,指针指向的数据接口的其实是可变的。下面的代码并不会报错:

实例

const a = [1, 2, 3];
console.log(a);
a[0] = 4;
console.log(a)
//[4, 2, 3]

如何定义一个不可变的数组常量,包括元素也不允许修改

const a = [1, 2, 3];
console.log(a);
Object.freeze(a);
a[0] = 4;
console.log(a)
//[1, 2, 3]

结果不会报错,但是修改没有生效

需要注意的是,被冻结后的对象不仅仅是不能修改值,同时也

  • 不能向这个对象添加新的属性
  • 不能修改其已有属性的值
  • 不能删除已有属性
  • 不能修改该对象已有属性的可枚举性、可配置性、可写性

建议判断清除情况再进行使用

总结:let const 的区别

  • var关键字声明的全局作用域变量属于window对象。
  • 使用let关键字声明的全局作用域变量不属于window对象。
  • 使用var关键字声明的变量在任何地方都可以修改。
  • 在相同的作用域或块级作用域中,不能使用let关键字来重置var关键字声明的变量。
  • 在相同的作用域或块级作用域中,不能使用let关键字来重置let关键字声明的变量。
  • let关键字在不同作用域,或不用块级作用域中是可以重新声明赋值的。
  • 在相同的作用域或块级作用域中,不能使用const关键字来重置var和let关键字声明的变量。
  • 在相同的作用域或块级作用域中,不能使用const关键字来重置const关键字声明的变量
  • const 关键字在不同作用域,或不同块级作用域中是可以重新声明赋值的:
  • var关键字定义的变量可以先使用后声明。
  • let关键字定义的变量需要先声明再使用。
  • const关键字定义的常量,声明时必须进行初始化,且初始化后不可再修改。