ES6 之前
var age = 20;
JS 引擎解析过程
var age; //提升到头部
age = 20;
// 所以一下代码是可以被成功运行的
name = 'wang';
var name;
// 以下为变量提上的场景
console.log(a); // undefuned
var a = 20;
// 上述代码等于
var a;
console.log(a);
a = 20;
ES6
let:特点
- 不可前置声明
// 合理做法
let age = 20;
// 不合理(var区别)
age = 20;
let age;
- 不可重复声明
// 使用 var
var a = 5;
var a = 3; // √
// 使用 let
let a = 5;
let a = 3; // ×
- 存在块级作用域
for(let i=0; i<3; i++) {
console.log(i);
}
console.log(i); // 错误
- 无法用 window 访问
var a = 3;
let b = 4;
window.a; // 3
window.b; // 错误
const用法:
let 的常见用法在 const 都有体现
不同之处
- 不能先声明再赋值
const a;
a = 20; // 这是不被允许的
- 声明后不可修改
const a = 4;
a = 5; // 错误
PS: 对象尤其值得注意
const obj = {x:20};
obj = {a:20}; // 错误
// 原因: {x:20} 与 {a:20} 在内存中都占据了一块内存,
// 上述复制语句实际上是将内存地址赋值给 obj 实质上是改变了 obj 的值
obj.x = 10; // 正确
// 原因: obj 的值无变化,是通过 obj 存储的地址找到这块内存,然后修改这块内存里的东西