var let const的相同点和不同点有很多,比较琐碎,总是让人迷惑,我整理了一张表,把它们理清楚。
序号 | 对比点 | var | let | const |
1 | 语法规范 | ES5 | ES6 | ES6 |
2 | 初始值是否必须 | 否 | 否 | 是 |
3 | 初始值是否能修改 | 是 | 是 | 否 ① |
4 | 是否能重复声明 | 是 | 否 | 否 |
5 | 是否会变量提升④ | 是 | 否 | 否 |
6 | 是否有暂时性死区 ② | 否 | 是 | 是 |
7 | 是否能先赋值后声明 ③ | 是 | 否 | 否 |
8 | 作用域 | 函数/全局 | 块级/函数/全局 | 块级/函数/全局 |
补充几点
① const的初始值不能被修改,是指声明的初始值为简单数据类型,如果声明的是引用类型(比如说对象),那么它的指针不能被修改,但是它的属性和属性值是可以修改的,看下边代码
const monkey = {name:'wukong'}
monkey.name = 'liuermihou'
monkey.height = 153//可以修改属性
console.log(monkey)//{name:'liuermihou',height:153}
monkey = {}//报错Uncaught TypeError: Assignment to constant variable.
② ③暂时性死区是什么意思呢?就是let和const在声明变量之前就使用它们,会导致报错。其实就是说let和const不能先赋值后声明
book = 'Journey to the west'
let book//报错Uncaught ReferenceError: Cannot access 'book' before initialization
④ 变量提升是什么意思?变量提升,提升的是作用域。ES6中引入了块级作用域,但是ES5中没有,所以在代码块{}中用var声明的变量,会被提升为全局变量。看下边代码
for(var i = 0;i < 5;i++){
}
for(let j = 0;j < 5;j++){
}
console.log(window.i)// 5
console.log(window.j)// undefined
PS. var给人的感觉是脾气怪,变化多端,且不易控制,所以编码建议是,不用var,尽量用const,不行了用let。
参考资料:《JavaScript高级程序设计(第4版)》3.3变量