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
                


















