-
var:
在ES5中,顶层对象的属性和全局变量是等价的,用
var声明的变量既是全局变量(node:global),也是顶层对象(浏览器:window)。-
使用
var声明的对象存在变量提升console.log(a) //undefined var a = 10 //编译阶段如下 var a console.log(a) a = 10 -
var可以对变量进行多次声明,后面声明的变量会覆盖前面的变量声明var a = 10 var a = 20 console.log(20) //20 -
在函数中使用
var声明的变量是局部的var a = 10 function change(){ var a = 20 } change() console.log(a) //10 -
在函数中不声明的变量是全局的
var a = 10 function change(){ a = 20 } change() console.log(a) //20
-
-
let :
ES6新增,用来声明变量
-
用法类似于
var,但是所声明的变量是局部变量{ let a = 20 } console.log(a) //ReferenceError: a is not defined -
不存在变量提升,或者说有变量提升,只是提升到了
暂时性死区,只有声明赋值后才能使用console.log(a) //Uncaught ReferenceError: Cannot access 'a' before initialization let a console.log(a) //undefined a = 10 console.log(a) //10 -
let不能在
相同作用域中重复声明let a = 10 let a = 20 //Uncaught SyntaxError: Identifier 'a' has already been declared
-
-
const:
const声明一个常量(只读),一旦声明,常量的值就不能被修改const a = 1 a = 3 //TypeError: Assignment to constant variable.const一旦声明就必须立即初始化,不能和var、let一样先声明后赋值const a //SyntaxError: Missing initializer in const declaration如果变量被声明过,再使用
const声明会报错var a = 10 let b = 10 const a = 20 //报错 const b = 20 //报错const实际保证的并不是变量的值不可改动,而是变量指向的那个内存地址所保存的数据不可改动。对于简单类型的数据(基本类型),值就保存在变量指向的内存地址。对于复杂类型的数据(引用类型),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证指针不变,但不能保证变量结构不变。const foo = {} //添加数据,成功 foo.a = 1; foo.a //1 //将foo指向另一个对象,报错 foo = {}其它情况,和
let一致 -
区别总结:
-
变量提升:
var声明的变量存在变量提升,在声明前调用值为undefined。let和const没有生命提升,或者说提升到暂时性死区,在声明前使用会报错。 -
暂时性时区:
var不存在暂时性死区。let和const存在暂时性死区,只有等到声明变量,才可以获取和使用该变量//var console.log(a) //undefined var a = 10 //let console.log(b) //Cannot access 'b' before initialization let b = 10 //const console.log(c) //Cannot access 'b' before initialization const c = 10 -
块级作用域:
var不存在块级作用域。let和const存在块级作用域。 -
重复声明:
var允许重复声明。let和const不允许重复声明 -
修改变量的值
var和let可以修改变量的值。const声明的是一个只读的常量,一旦声明不可修改。
-
-
使用:
能用
const尽量使用const,大多数情况使用let,避免使用var,防止全局变量污染。
参考文献:
https://vue3js.cn/interview/es6/var_let_const.html
https://es6.ruanyifeng.com/
浙公网安备 33010602011771号