var 是ES5中声明变量的方式,ES6中新增了let 和 const两种生命变量的方式。
1.let
用法类似于var 基本用法:
let a = 1;
var a = 1;
let与var的区别:
1) 块级作用域
var 声明的变量,不存在块级作用域,只存在函数作用域。
比如说
console.log(a) // undefined
{
var a = 1;
}
console.log(a) // 1
而let命令所声明的变量,只在let
命令所在的代码块内有效。
{
let a = 1;
}
console.log(a); // a in not defined
2) 暂时性死区和变量提升
在ES5中存在变量提升,函数及变量的声明都将被提升到函数的最顶部,这使得你可以在声明一个变量前就使用它
console.log(a) // undefined
var a = 1;
上面的代码相当于
var a;
console.log(a) // undefined
a = 1;
let 和 const不存在变量提升,如果你在声明一个变量前使用它那么就会报错
console.log(a)
let a = 1; // ReferenceError
如果区块中存在let,const 那么在这个区块用这些命令声明的变量一开始就绑定了这个作用域,形成了封闭作用域,不再受外界影响。在该变量声明前,该变量都是不可用的,这在语法上叫做 暂时性死区
看下面的例子
var a = 1;
{
console.log(a) // ReferenceError: a is not defined
let a = 2;
}
var a = 1;
{
console.log(a) // 1
var a = 2;
}
// a 是全局变量 但是块级作用域内let又声明了一个局部变量a,导致后者绑定这个块级作用域,所以在let声明变量前,对a操作机会报错。
3)不允许重复声明
直接看代码
var a = 1;
var a = 2;
console.log(a) // 2
let a = 1;
let a = 2;
console.log(a) // Identifier 'a' has already been declared
2.const
const
声明一个只读的常量。一旦声明,常量的值就不能改变。
用法:
const a = 1;
a = 2; // TypeError: Assignment to constant variable.
值得注意的是,const的本质,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。
由于基本类型的变量存放在栈区,引用类型的变量同时保存在堆内存和栈内存(对象保存在堆内存,而对象的引用保存在栈内存,js是不允许直接操作堆内存,当我们操作的时候,实际上操作的是保存在栈内存的对象的引用)
对于引用数据类型,const只能保证指向这个对象的引用的指针是不变的,因此,当用const 声明一个对象或数组时,是可以对数组或数组中的数据进行变动的
const a = [1,3,3]
a[0] = 2;
console.log(a) // [2,3,3]
const a = {
b: 1,
c: 2
}
a.c = 3;
console.log(a); // {b:1 ,c:3}