在ES6之前,变量的声明只能用var, ES6新增了let和const两中方式声明变量,接下来讲述三者之间在使用时的区别。
- var存在变量提升,而let和const不存在变量提升,即变量只能在声明之后使用,否则会报错,这在语法上,称为暂时性死区
console.log(a) //undefined
var a='123'
console.log(b) //Cannot access 'b' before initialization
let b='123'
console.log(c) //Cannot access 'c' before initialization
let c='123'
- 在函数内使用var声明变量时,变量是局部的,而不用var声明直接使用,变量是全局的
function fun(){
var a=1
b=2
}
fun()
// console.log(a); // Uncaught ReferenceError: a is not defined
console.log(b); // 2
- var可以重复声明,但是let和const不能
var a=12
console.log(a); //12
var a='你好'
console.log(a); //你好
var a={
name:'a',
age:12
}
console.log(a); //{name: 'a', age: 12}
var b=12
console.log(b);
var b='你好'
console.log(b); //Identifier 'b' has already been declared
//同理const一样报错
- let,var 在声明变量时可以不设置初始值,但是const必须设置初始值
-
var 声明的变量为全局变量时,会将该变量添加为全局对象的属性,但是let 和 const 不会。
-
let 和 const 都是 ES6 新增的用于创建变量的语法。 let 创建的变量是可以更改指针指向(可以重新赋值)。但 const 声明的变量是不允许改变指针的指向。
-
但是 const 保证的并不是变量的值不能改动,而是变量指向的那个内存地址不能变动。对于基本类型的数据(string,number,boolean),指针指向的地址中存的就是变量值,所以不能变动,等同于常量;而引用数据类型(数组,对象),变量指向的内存地址中保存的是一个指针,只要这个指针不变即这个指针指向的内存空间不变就ok了,至于它指向的数据结构改不改变就不能控制了。
-
const a='勇敢猪猪'
a='不怕困难' // Assignment to constant variable.
const b={
name:'勇敢猪猪'
}
b.name='不怕困难'
console.log(b); //{name: '不怕困难'}
区别 | let | const | var |
---|---|---|---|
是否具有块级作用域 | √ | √ | × |
是否存在变量提升 | × | × | √ |
是否添加全局属性 | × | × | √ |
能否重复声明 | × | × | √ |
是否存在暂时性死区 | √ | √ | × |
能否改变指针指向 | √ | × | √ |
是否必须设置初始值 | × | √ | × |