ECMAScript6----var、let、const
ECMAScript6----var、let、const
- 1.var
- 2.let
- 3.const
1.var
(1)在相同作用域下可重复声明
var a = 20
var a = 30
console.log(a) // 30
(2)存在变量提升
console.log(a) // undefined
var a = 20
(3)可修改声明的变量(与const
对比)
var a = 20
a = 12
(4)不存在暂时性死区
(5)与window
相映射
var a = 10;
console.log(window.a) // 10
2.let
(1)在相同作用域下不可重复声明(与var
作对比)
如下,重复声明a会报错。
(2) 不存在变量提升(与var
对比)
console.log(a) // 报错
let a = 20
上述代码在浏览器中会报错,如下:
(3)可修改声明的变量(与const
对比)
let a = 20
a = 12
(4)存在暂时性死区(与var
做对比)
注意:什么是暂时性死区?
在某个作用域中,用let
,const
定义了某变量,在该作用域内部该代码之前不能使用该变量。
var a = 123
if (true) {
a = 'abc' // ReferenceError
let a;
}
(5)不与window
相映射(与var
做对比)
let b = 12;
console.log(window.b); //undefined
3.const
(1)在相同作用域下不可重复声明(与var
做对比)
如下,重复声明x会报错。
(2)不存在变量提升(与var
做对比)
console.log(a) // 报错
const a = 20
上述代码在浏览器中会报错,如下:
(3)不可修改声明的对象(引用对象可以修改)
不可修改基本数据类型变量,如下:
const y = 12;
y = 14;
控制台会报错:
可以修改引用数据类型变量的某个属性,如下:
const obj1 = { name: "bob" };
obj1.name = "jack";
console.log(obj1); //不会报错,打印{name: 'jack'}
但不能修改引用数据类型变量的地址,如下:
const obj2 = { name: "bob" };
obj2 = { name: "jack" }; //会报错
console.log(obj2);
之所以会出现这样子的原因,这个涉及到基本数据类型和引用数据类型在内存中的存储方式不同。
基本数据类型的值直接存储在栈内存中,值与值之间独立存在,修改一个变量不会影响到其他变量。对象(引用数据类型)是保存在堆内存中的,每创建一个新对象,就会在堆内存中开辟出一个新空间,变量保存的是对象的内存地址(对象的引用)。
(4)存在暂时性死区(与var
做对比)
(5)不与window相映射(与var
作对比)
const c = 10;
console.log(window.c) // undefined