var、let、const 的区别

114 阅读2分钟

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:

  1. 这里的 obj 是属于复杂类型,或者引用类型的时候,那 obj 存的就是 { a: 1 } 的地址啊!那只要地址不变,那就没有问题啊!

那给 obj.a = 2,那 obj 里面存的地址变没变啊?

因为指向的还是这个对象,只不过对象里面的东西发生了改变。

  1. 但是这么写 obj = { a: 2 },这个意思是我新生成了个对象,然后赋值给 obj,那这个 obj 的地址是不是变了呀?那就会报错嘛!

哦哦...似懂非懂

小结

  • 请大量地使用 let,你都用 ES6 的语法了,还用什么 var
  • 你觉得不可变的,那就用 const,比如引用一个模块、定义一个全局的url