1.基本使用区别
A.var和let用于声明变量,而const用于声明常量;
B.var声明的变量不存在块级作用域,在全部范围内都有效,(原因:会变量提升);而let和const声明的只能在块级区域内有效(例如"{","}"之间有效);
C.var存在变量提升,可以先使用后声明;而let和const只能先声明后使用;
D.var允许变量名重复,即可以多次重复声明;而let和const不可以;
E.const在声明变量时必须为其赋值,在声明之后不可改变;如果声明的是一个对象,则会存储引用地址,地址不会改变,但是地址中存储的对象可以。
2.部分举例
问题:使用var会造成变量穿透,如何解决
案例:
//输出十个 10
for (var i = 0; i < 10; i++) {
setTimeout(function(){
console.log("var====",num--,"--",i);
})
}
// 输出0-9
for (let j = 0; j < 10; j++) {
setTimeout(function(){
console.log("let====",j);
})
案例结果:
3.实现原理区别
变量与内存之间,主要是三个名词:变量名,内存地址,内存空间
JS引擎在读取变量时,先找到变量绑定的内存地址,然后找到地址所指向的内存空间,最后读取内容。
当变量改变时,JS引擎不会使用新值覆盖之前旧值的内存空间(虽然在代码角度,看上去是覆盖的),而是重新分配一个新的内存空间来存储新值,并将新的内存地址与变量进行绑定,JS引擎会在合适的时候进行GC,回收旧的内存空间。
const定义变量(常量)之后,变量名与内存地址之间就已经建立了不可变的绑定关系,阻隔变量地址被改变,当const定义的变量重新赋值时,JS引擎会尝试分配新的内存空间,所以会被拒绝,抛出异常。