先看一下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 < 10; 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”很多情况下是一个带有自增或自减操作的表达式,以使循环条件逐渐变得“不成立”。
标签:index,const,let,var,执行,表达式 From: https://www.cnblogs.com/mengzekun/p/16908405.html