var、let、const
var 和 let 的区别
都是用来声明变量
var 没有块级作用域,会导致一些不必要的麻烦
let 有块级作用域,是更完美的 var
我基本不用var
1. var 可声明前置
并且可以重复声明
a = 1
var a
var a = 2
// 不报错
2. let 不可以声明前置
a = 1
let a
// 报错
3. let 不可重复声明
let a = 1
let a = 2
// 报错
let a = 1
var a = 2
// 报错
4. let 存在块级作用域
作用域可以认为是两个大括号之间的区域
function fn() {
let a = 1
console.log(a)
}
console.log(a)
// 报错
5. let 暂时性死区
在 let 声明变量之前都是该变量的死区,在死区内不可使用该变量
这也需要拿出来说?
const
用来声明常量
拥有 let 的特性,但是被声明的常量必须赋值,而且值不可改变!
被 const 声明的常量不可改变
示例1:
const a = 1
a = 2 // 报错
能理解!简单嘛!
示例2:
const obj = { a: 1 }
obj.a = 2 // 不报错
obj = { a: 2 } // 报错
啊你骗人,你明明说了不可改变,那为什么 obj.a = 2 不报错?!?!
我们先来说说示例1:
示例1的 a 是简单类型,所以直接赋值的话,相当于改变 a 的值
再说说示例2:
- 这里的 obj 是属于复杂类型,或者引用类型的时候,那 obj 存的就是 { a: 1 } 的地址啊!那只要地址不变,那就没有问题啊!
那给 obj.a = 2,那 obj 里面存的地址变没变啊?
因为指向的还是这个对象,只不过对象里面的东西发生了改变。
- 但是这么写 obj = { a: 2 },这个意思是我新生成了个对象,然后赋值给 obj,那这个 obj 的地址是不是变了呀?那就会报错嘛!
哦哦...似懂非懂
小结
- 请大量地使用 let,你都用 ES6 的语法了,还用什么 var
- 你觉得不可变的,那就用 const,比如引用一个模块、定义一个全局的url