Appearance
var、let 和 const 区别
名称 | var | let | const |
---|---|---|---|
块作用域 | ✔ | ✔ | |
全局属性 | ✔ | ||
变量提升 | ✔ | ||
暂时性死区 | ✔ | ✔ | |
重复申明 | ✔ | ||
必须初始化 | ✔ | ||
不可修改值 | ✔ |
var
与 let
比较
var
与let
都拥有全局作用域
、函数作用域
,let
还有块级作用域
;
jsx
// 全局作用域
var var_a = 1;
let let_a = 1;
// 函数作用域
function () {
var var_b = 2;
let let_b = 2;
}
// 块级作用域
{
var var_c = 3
let let_c = 3
}
console.log(var_c) // 1
console.log(let_c) // let_c is not defined
var
的全局属性会添加给window
,未申明直接赋值也会挂在window
,let
不会;
js
var a = 1
b = 1
let c = 1
console.log(window.a) // 1
console.log(window.b) // 1
console.log(window.c) // undefined
- 未申明先使用的变量,
var
存在变量提升,let
存在暂时性死区;
js
console.log(a) // undefined
console.log(b) // Cannot access 'b' before initialization
var a = 1
let b = 2
- 同一作用域里,
var
可以重复申明,let
不行;
js
var a = 1
var a = 2
let b = 1
let b = 2 // SyntaxError: Identifier 'b' has already been declared
const
与 let
比较
const
与 let
类似,但必须初始化,并且不可修改;当初始值为引用类型时,引用类型内部的值可修改。
js
const a // SyntaxError: Unexpected token
const b = { c: 1 }
b = 1 // Assignment to constant variable
b.c = 2;
console.log(b) // { c: 2 }
应用场景
- 利用
let
块级作用域特性来写循环。
js
for (var index = 0; index < 5; index++) {
setTimeout(() => console.log(index))
}
// 其输出结果:5 5 5 5 5
for (let index = 0; index < 5; index++) {
setTimeout(() => console.log(index))
}
// 其输出结果:0 1 2 3 4
- 利用
const
对前端常用展示文本统一管理,即防止串改,也方便修改。
js
// constant.js 文件
export const TITLE = '我是标题'
export const AUTHOR = '作者'
// 任意文件引入使用
import { TITLE, AUTHOR } from 'constant.js'