let、const、var
1.var
在Es6之前我们都使用var来声明变量,但是var声明的变量都会进行一个变量提升,也就是都挂载到了window这个对象身上
js
var num = 111
var num2 = 222
console.log(window.num) // 111
console.log(window.num2) // 222这样所有的变量都在一个作用域,会引发很多问题,开发中尽量不使用var
2.let
let是Es6的一个新修饰符,也是用来声明变量,let有以下特点:
let用于声明变量jslet num = 11 num=222let不允许重复声明相同名称的变量jslet num = 11 let num = 22 // 错误let声明的变量不会在预解析的时候解析,也就是不会变量提升jslet num = 11 console.log(window.num) // undefined function test() { let num = 22 console.log(window.num) // undefined }let声明的变量,所有代码块都会限制其作用域jslet num = 11 const fn = () => { let num = 22 console.log(num) // 22 } console.log(num) // 11
3.const
const是Es6的一个新修饰符,也是用来声明常量,const有以下特点:
const用来声明常量,也就是不可变的量jsconst num = 666 num = 777 // error: Assignment to constant variable. 常量不可修改const声明的常量必须有初始值jsconst num // error:'const' declarations must be initialized. 常量必须有初始值const不可重复声明相同名称的常量jsconst num=666 const num=777 // error: Identifier 'num' has already been declared num已被定义const声明的常量,所有代码块都会限制其作用域jsconst num = 11 const fn = () => { const num = 22 console.log(num) // 22 } console.log(num) // 11
注意
const声明基本数据类型时,常量的值不可改变
但是声明复杂数据类型时,却可以修改里面数据的值
js
const obj = {
num: 111,
}
console.log(obj.num) // 111
obj.num = 222
console.log(obj.num) // 222但是直接修改复杂数据本身也是不行的
js
const obj = {
num: 111,
}
obj = {} // err 常量不可修改这是因为声明复杂数据类型时,栈中存储的是数据的堆地址,内部的数据都存储在堆中
const的本质是不可修改其在栈中存储的数据
4.let和const
4.1 共同点
let和const有以下共同点:
- let和const都不可重复声明变量
- let和const声明的变量都不会变量提升
- let和const都会被代码块限制作用范围
4.2 不同点
let和const有以下不同点:
- let声明的变量可以没有初始值,const声明的常量必须有初始值
- let声明的变量可以修改,const声明的常量不可修改
