# 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的区别

  1. 使用var声明的变量,其作用域为 该语句所在的函数内,且存在变量提升现象
  2. 使用let声明的变量,其作用域为 该语句所在的代码块内,不存在变量提升
  3. 使用const声明的时常量,在后面出现的代码中,不能再修改该常量的值
var let const
函数级作用域 块级作用域 块级作用域
变量提升 不存在变量提升 不存在变量提升
值可更改 值可更改 值不可更改
更新时间: 7/11/2021, 11:33:09 AM