开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
定义:let和const是ES6新增的声明变量的关键词,es6之前是var关键词
区别:
- var定义的变量,js引擎可以预解析,也就是所谓的变量提升,结果是undefined,let和const定义的变量不能被预解析,未声明就调用会报错
- var定义的变量,变量名称可以重复定义,后一次会覆盖前一次的结果,而let和const定义的变量不能重复,执行会报错
- const定义的是常量,不可修改初始化的赋值结果(如果是对象,可以改变里面的属性)
- let声明范围是块级作用域(比如{},if{}块,for(){}块),而var是函数作用域(在声明的函数体以及函数体嵌套的任意函数体都是有定义的)
- for循环语句中,var定义的变量和let定义的变量执行原理不同,结果也不一致,var定义的变量在整个循环中,会进行重复赋值,直到循环结束,最后拿到的是最后一次赋值的数据,而let定义的变量,在循环中,每次循环相当于触发一个{}块级作用域,不会覆盖赋值,而let定义的变量在每个独立的块级作用域内有效,所以会拿到不同的值
代码辩证
//提前访问var定义的变量,输出undefined
console.log(foo)//undefined
var foo = "abc";
//提前访问let、const定义的变量,报错
console.log(foo)//ReferenceError: Cannot access 'foo' before initialization
let foo = "abc";
//var重复赋值,后面的会覆盖前面的结果
var foo = 1;
var foo = 2;
console.log(foo);//2
//let、const重新赋值后,会报错
let foo = 1
let foo = 2 //The symbol "foo" has already been declared
//作用域问题 let定义的变量作用域范围是块级
if(true){
var foo = 1;
let bar = 2;
}
console.log(foo)//1
console.log(bar)//ReferenceError: bar is not defined
//const定义常量,不能重新赋值 如果是引用类型,可以更改其内部属性值,因为引用地址未改变
const foo = 1;
foo = 2;//报错 TypeError: Assignment to constant variable.