「这是我参与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++) {
// 一些代码...
}
// 这里输出 i 为 10
使用 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关键字定义的常量,声明时必须进行初始化,且初始化后不可再修改。