一、探究var、let和const的异同:
因经常在webstorm上写var被推荐更改为let,于是重点突破一下这方面异同。
1、var和let:
(1)作用域:
var的作用域为全局或函数块中的范围,而let的作用域为全局、函数块或if、while等代码块的范围,更接近c++或Java的赋值逻辑。
相比之下let比var更具灵活性。
(2)重复声明:
var支持重复声明,而let不支持(会报错)。
var实例:
var a=1;
var a=2;
console.log(a); //输出2
function(){
var a=3;
var a=4; //输出4
}
let实例:
let a = 1;
let a = 2; // SyntaxError: Identifier 'a' has already been declared
(3)绑定全局对象:
var在全局环境中声明时,会在全局对象中新建一个属性,而let不会。
具体表现:var声明的变量被储存在[[scopes]][1]:global中,let声明的变量被储存在[[scopes]][0]:script中。
(4)变量提升与暂存死区:
通俗的讲:
var在创建时直接完成初始化。
如下代码:
console.log(a);
var a=10;
//不会报错,输出undefined
在控制器中执行的代码是:
var a;
console.log(a);
a=10;
这就是变量提升,函数也有同样的函数提升
而let在创建时不会完成初始化,即需等待初始化完成后才可以调用。
摘录定义:在变量初始化前访问该变量会导致 ReferenceError,因此从进入作用域创建变量,到变量开始可被访问的一段时间(过程),就称为暂存死区(Temporal Dead Zone)。
2、let和const:
(1)区别:
let和const都具有上文所提的let的属性,不同的是const声明的是一个只读变量,只允许使用不允许更改,因此const声明的变量在创建时就必须初始化,否则会报错。
(2)关于只读变量的理解:
const并不是保证变量的值不变,只是保证储存该变量的地址中的值不变
JS中分为两类数据类型:原始值类型和对象。
对于原始值类型:值就储存在变量指向的那个地址中,所以const声明的变量等同于常量。
对于对象类型:变量储存的只是指向该对象的指针,所以不可修改的只是该指针,内部值仍可修改。