我正在参加「掘金·启航计划」
总结
| 关键词 | 块级作用域 | 变量提升 | 全局属性 | 重复声明 | 暂时性死区 | 必须赋初值 | 能否修改值 |
|---|---|---|---|---|---|---|---|
| var | × | √ | √ | √ | × | × | √ |
| let | √ | × | × | × | √ | × | √ |
| const | √ | × | × | × | √ | √ | × |
变量提升
只有var具有变量提升 (不管在在一个作用域内何处定义变量,都会将此变量提升至作用域的顶部,但不会包括已赋的初值)
{
console.log(e)
var e = 3
}
这段代码在一个块级作用域内声明了e变量,通过变量提升,将会使得变量被提升到作用域的顶端,但值不会,所以结果为
undefined
若将声明换成let\const e =3,结果为
Uncaught ReferenceError: e is not defined
作用域
let\const是块级作用域,而var是全局或者上下文作用域,看下面的代码
let arr = []
for (var i = 0; i < 2; i++) {
arr[i] = function (){
console.log(i)
}
}
arr[0]()
arr[1]()
输出为
2
2
为什么呢?原因是var的作用域为全局,所以当arr[0/1]()执行匿名函数时,找到的是全局级别的i,此时经过for循环,i的值已经变为了2,所以输出都为2
将var换成let
let arr = []
for (let i = 0; i < 2; i++) {
arr[i] = function (){
console.log(i)
}
}
arr[0]()
arr[1]()
输出结果如下
0
1
let的作用域为块级,在这里就是for循环,所以在作用域结束后,值也对应的绑定上了
重复声明
var a = 1
var a = 2
console.log(a)
var支持重复声明,他会覆盖已声明变量的值,但在同一作用域内,let\const不支持重复声明
var a = 1
var a = 2
let a = 3
console.log(a)
这样将会得到SyntaxError: Identifier 'a' has already been declared ,而如果给let放在另一个块级作用域内,又将会是合法的
var a = 1
var a = 2
{
let a = 3
}
console.log(a)
暂时性死区
简单来讲,就是在let\const变量声明前,不能使用他们,否则将会得到一个报错,比如
console.log(a)
let a = 3
结果就是
e is not defined
const
const和let一样,具有绝大多数相同的属性,但const是用来定义常量的,类似于Java中的final等等,是在定义后不能更改值的,所以必须赋初值
但const又能更改"值",这是为什么呢?
const固定基本类型的值与引用类型的内存地址
如下
const a = 3
//a = 4 不能修改基本类型的值
const b = {name: "Z",age: 20}
b.name = "A" //可以修改引用类型的值
//b = {name: "C",age: 10} 不能修改内存地址
以上就是本篇文章的全部内容,希望大家能有所收获