var、const、let的区别
1、作用域
var是函数作用域,let和const是块级作用域
在函数内部省略var操作符时,会创建一个全局变量。
函数作用域:在函数退出时,变量会被销毁。
块级作用域:块作用域由 { } 包括,if语句和 for语句里面的{ }也属于块作用域。
if语句中的let
if(typeof name===undefined){
let name='白雪公主'
}
console.log(name) // ReferenceError: name is not defined
if(typeof name===undefined){
let name
}
name='白雪公主' // 相当于使用var全局定义了一个变量
console.log(window.name)// 白雪公主
console.log(name) // 白雪公主```
for循环中的let
for (var i = 0; i < 5; ++i) {
setTimeout(() => console.log(i), 0)//最后输出5个5
}
console.log(i)//先输出i,5
console.log(111)//再输出111
//执行顺序是先跳出for循环,再执行setTimeout中的语句,在跳出for循环时i的值为5,所以最后执行setTimeout时i一直都是等于5
for (let i = 0; i < 5; ++i) {
setTimeout(() => console.log(i), 0)//最后输出1、2、3、4、5
}
console.log(111)//先跳出for循环,输出111
//使用 let 声明迭代变量时,JavaScript 引擎在后台会为每个迭代循环声明一个新的迭代变量,每个 setTimeout 引用的都是不同的变量实例
2、变量提升
var存在变量提升(提升变量的定义,不提升变量赋值),let和const不存在变量提升
3、let 和const不允许同一个块作用域中出现冗余声明
4、使用 let和const 在全局作用域中声明的变量不会成为 window 对象的属性(var 声明的变量则会)。
5、声明const变量时必须初始化,如果定义的是基本数据类型时,他的值是不允许修改的,如果是引用数据类型,是可以修改他的值的,且只能修改他的值
const a='我不可以被修改哦'
a = '我试试' // 报错Assignment to constant variable
console.log(a)
const a={
name:'白雪公主',
age:'16'
}
a.name='七个小矮人'
console.log(a.name)//七个小矮人
a.hight='100cm'
console.log(a.height) //undefined
const a={
aa:{
name:'小明',
age:18
},
bb:{
name:'小红',
age:17
}
}
a.aa.height='175'//aa对于对象a来说是a的属性,所以可以修改给对象aa新增属性
console.log(a.aa.height) //175
let、const、var使用原则:
在变量不会变时,使用const;未来会有修改时使用let