深入理解var、let、const

先看一下var、let、const基本的异同,再详细的介绍这三个东西:

1、var存在变量提升,let和const

2、var一个变量可多次声明,后面的声明会覆盖前面的声明,let、const不能

3、在函数中var声明变量,该变量是局部的,而如果在函数内不使用var,该变量是全局的。let和const只在块级作用域内有效

 var a = 10
 function fn() {
   var a = 20
 }
 fn()
 console.log(a) // 20

如果函数中没有重新var,则最后拿到的a的值为10

4、var和let可先声明后赋值,且变量的值可修改。const必须声明即赋值,声明的变量值不可修改(声明引用数据类型的值可修改,比如:对象、数组。原因见下)

注:基本数据类型存在栈中,const不可修改,引用数据类型在栈中存的是指向堆的地址,在堆中存的是对象和数组中的数据,const不能修改指针,所以不能直接改变对象,只能改变对象中的属性值。

使用:
能用const的情况下尽量使用const,大多数情况使用let,避免使用var。
const > let > var
 
扩展:let和var在for循环中的不同
for (let index = 0; index < 3; index++) {
    setTimeout(() => {
        console.log(index)
    }, 1000);
}
// 0
// 1
// 2

for (var i = 0; i < 3; i++) {
    setTimeout(() => {
        console.log(i, 'qqq')
    }, 1000);
}
// 3
// 3
// 3

let index
for (index = 0; index < 3; index++) {
    setTimeout(() => {
        console.log(index)
    }, 1000);
}
// 3
// 3
// 3

这两个的不同就是因为var存在变量声明提升,第三个例子就相当于var

顺便补一下for循环的执行顺序:

for(表达式1; 表达式2; 表达式3){
    语句块
}

它的运行过程为:
1) 先执行“表达式1”。
2) 再执行“表达式2”,如果它的值为真(非0),则执行循环体,否则结束循环。
3) 执行完循环体后再执行“表达式3”。
4) 重复执行步骤 2) 和 3),直到“表达式2”的值为假,就结束循环。
上面的步骤中,2) 和 3) 是一次循环,会重复执行,for 语句的主要作用就是不断执行步骤 2) 和 3)。


“表达式1”仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句。“表达式2”一般是一个关系表达式,决定了是否还要继续下次循环,称为“循环条件”。“表达式3”很多情况下是一个带有自增或自减操作的表达式,以使循环条件逐渐变得“不成立”。

 

 

 

 

posted @ 2022-11-21 21:54  泽东玩乾坤  阅读(239)  评论(0编辑  收藏  举报