我们都知道在ES6之前我们声明变量一般都是以var 关键字来实现的,在ES6我们新出现了两个声明变量的关键字也就是let,const,接下来我们来看下它和var有什么不同.
1. var具备变量提升,而let,const不具备此特性
console.log(a); //undefined
var a = 2;
console.log(b); // b is not defined
let b = 3;
console.log(c); // c is not defined
const c = 4;
2. var在全局作用域当中声明的变量会自动绑定this(window),let,const则不会
var a = 2;
console.log(a); // 2
console.log(this.a); // 2
console.log(window.a); // 2
let b = 3;
console.log(b); // 3
console.log(this.b); // undefined
console.log(window.b); // undefined
const c = 4;
console.log(c); // 4
console.log(this.c); // undefined
console.log(window.c); // undefined
3. 重复声明变量会如何?
var a = 2;
var a = 3;
console.log(a); // 3
let b = 3;
let b = 4;
console.log(b); // 这样则会报错,b标识符已被声明
// 关于这点其实是在同一作用域下let声明的变量不可重复声明,接下来我们会来演示下.
let c = 3;
{
let c = 4;
}
console.log(c); // 3
// 实际上let也具备块级作用域
const d = 3;
const d = 4;
console.log(d); // 这样则会报错,d标识符已被声明
// 实际上const和let有一些相似,都具备块级作用域,但是有一点不同,往下继续看.
const e = 2;
e = 3;
console.log(e); //报错
// 实际上const声明的变量 不可在更改.
// 现在我们展示另一种体现.
const obj = {};
obj.a = 3;
console.log(obj.a); // 3
// 这里可能有些小伙伴比较迷惑,明明const不能更改,为什么这样没有报错.
// 事实上我们知道obj指向的是一个引用类型.
// 而obj.a = 3 这不过是在引动类型上添加了一个属性并没有更改obj的指向.
const obj = {};
obj = 3;
console.log(obj); // 报错
// 首先obj指向的是一个引动类型也就是一个空的Object
// 其次我们更改obj的指向为基本类型Number
// 这不就是更改了我们的指向了吗,所以会产生报错
小伙伴们懂了吗哈哈哈
转载 沉鱼落木