# 2.ES6变量声明
# let
ES6中新增的用于声明变量的关键字
- let声明的变量只在所处于的块级有效
if (true) {
let a = 10
console.log(a) // 10
}
console.log(a) // a is not defined
if (true) {
var b = 10
console.log(10) // 10
}
console.log(10) // 10
- 防止循环变量变成全局变量
for (let i = 0; i < 2; i++) {
}
console.log(i) // i is not defined
for (var i = 0; i < 2; i++) {
}
console.log(i) // 2
- 不存在变量提升
console.log(a) // a is not defined
let a = 20
- 暂时性死区
var num = 10
if (true) {
console.log(num) // num is not defined
let num = 20
}
# 经典面试题
var arr = []
for (var i = 0; i < 2; i++) {
arr[i] = function () {
console.log(i)
}
}
// i = 2
arr[0]() // 2
arr[1]() // 2
//==================================//
// 改为let
let arr = []
for (let i = 0; i < 2; i++) {
arr[i] = function () {
console.log(i)
}
}
arr[0]() // 0
arr[1]() // 1
// 因为let产生的块级作用域互不影响,因此在for循环之中,每个i的值都是独立的,都是独立赋值给了匿名函数中的i
# const
作用:声明常量,常量就是值(内存地址)不能变化的量
- 具有块级作用域
if (true) {
const a = 10
}
console.log(a) // 报错 a is not defined
- 声明常量时必须赋初始值
const PI // 报错 Missing initializer in const declaration
- 常量赋值后,值不能修改
const PI = 3.14
PI = 3.1415926
// 报错 Assignment to constant variable.
// 而对于复杂数据类型,不对其存储地址进行修改的修改,还是可以进行修改的
// 如,按照索引值修改数组元素、修改对象中的属性
// 数组
const arr = [123, 234]
arr[0] = 345
arr[1] = 456
// 不会报错
console.log(arr) // [345,456]
arr = [567, 678] // 报错 Assignment to constant variable.
// 对象
const people = {
name: '张三',
teacher: '罗翔'
}
people.name = '李四'
people.teacher = '沈逸'
// 不会报错
console.log(people) // {name: '李四', teacher: '沈逸'}
people = {
name: '王五',
teacher: '赵六'
}
// 报错 Assignment to constant variable.
# let、const、var的区别
- 使用var声明的变量,其作用域为 该语句所在的函数内,且存在变量提升现象
- 使用let声明的变量,其作用域为 该语句所在的代码块内,不存在变量提升
- 使用const声明的时常量,在后面出现的代码中,不能再修改该常量的值
var | let | const |
---|---|---|
函数级作用域 | 块级作用域 | 块级作用域 |
变量提升 | 不存在变量提升 | 不存在变量提升 |
值可更改 | 值可更改 | 值不可更改 |