ES6新特性之let、const、var的区别

ES6新特性之let、const、var的区别

特此说明: 借鉴阮一峰老师的ECMAScript 6 入门;传送门,MDN文档;传送门

let const var关键字

三个关键字的区别:

let const var
变量提升 × × √
全局变量 × × √
重复声明 × × √
重新赋值 √ × √
只声明不初始化 √ × √
暂时死区 √ √ ×
块作用域 √ √ ×
  1. 什么是变量提升
  • var关键字声明的变量,无论实际声明的位置在何处,都会被视为声明在函数的顶部(如果声明不在任意函数内,则视为在全局作用域的顶部)
  • JavaScript引擎的工作方式是,先预解析代码, 获取所有被声明的变量和函数声明,然后再一行一行地运行,这就使所有变量声明的语句,都会被提升到代码的头部,这就是变量提升
js 复制代码
//var关键字声明时
console.log(b) //undefined 
var b = 3; 
console.log(b); // 3

上面代码首先在控制台显示未声明的变量,本来是错误的做法但是没有报错.因为JS的变量提升.真正运行的是以下代码

js 复制代码
var b ; 
console.log(b);
b = 1; 
console.log(b);
  • let声明的变量不会在作用域中被提升;在let声明之前的执行瞬间被称为"暂时性死区",在此阶段引用任何后面才声明的变量都会抛出。
js 复制代码
let a = 1; 
console.log(a);//1 
console.log(b);//Uncaught ReferenceError: b is not defined 
let b = 2;
  1. 全局变量
  • 使用let和const在全局作用域中声明的变量不会成为window对象的属性,var声明的变量则会。
js 复制代码
//var关键字
var name = 'Yu'; 
console.log(window.name);//'Yu'

//let关键字
let age = 'Yu'; 
console.log(window.name);//undefined
  1. 重复声明
  • var允许重复声明变量
  • let和const在同一作用域不允许重复声明变量
js 复制代码
// var关键字
var a = 10
var a = 20 // 20

// let关键字
let b = 10
let b = 20 // Identifier 'b' has already been declared
// const关键字
const c = 10
const c = 20 // Identifier 'c' has already been declared
  1. 重新赋值
  • var和let可以重新赋值
  • const声明一个只读的常量。一旦声明,常量的值就不能改变
js 复制代码
// var关键字
var a = 10
a = 20
console.log(a)  // 20

//let关键字
let b = 10
b = 20
console.log(b)  // 20

// const关键字
const c = 10
c = 20
console.log(c) // Uncaught TypeError: Assignment to constant variable
  1. 只声明不初始化
  • 在首次声明时let var可以不赋值
  • const声明必须赋值
  1. 暂时死区
  • 什么是暂时性死区:let、const关键字声明的变量会产生块级作用域,如果变量在当前作用域中被创建之前被创建出来,由于此时还未完成语法绑定,如果我们访问或使用该变量,就会产生暂时性死区的问题,由此我们可以得知,从变量的创建到语法绑定之间这一段空间,我们就可以理解为'暂时性死区'
  • var不存在暂时性死区
  • let和const存在暂时性死区,只有等到声明变量的那一行代码出现,才可以获取和使用该变量
js 复制代码
// var关键字
console.log(a)  // undefined
var a = 10

// let关键字
console.log(b)  // Cannot access 'b' before initialization
let b = 10

// const关键字
console.log(c)  // Cannot access 'c' before initialization
const c = 10
  1. 块作用域
  • var不存在块级作用域
  • let和const存在块级作用域
js 复制代码
// var关键字
{
    var a = 20
}
console.log(a)  // 20

// let关键字
{
    let b = 20
}
console.log(b)  // Uncaught ReferenceError: b is not defined

// const关键字
{
    const c = 20
}
console.log(c)  // Uncaught ReferenceError: c is not defined
相关推荐
2401_885885046 分钟前
巴林语音通知接口如何对接?系统告警语音API接入教程
android·前端·网络·python·语音识别
java1234_小锋6 分钟前
【技术专题】CSS3 网页技术 - CSS3 盒模型
前端·css·css3
计算机魔术师9 分钟前
手握芯片、又要吞下开源分发入口,英伟达被盯上了
前端
段一凡-华北理工大学40 分钟前
高炉能源系统智能化:热风炉、煤气与极致能效~系列文章07:高炉煤气:产生规律与全厂用户平衡
java·前端·能源
前端架构师-老李1 小时前
HTML与CSS基础第四课—strong、em、b、i 各表示什么
前端·css·html
king王一帅2 小时前
AI 时代一群人在卷笔记软件,我想先把 Markdown 编辑器的底层做好
前端·ai编程·markdown
用户11481867894842 小时前
盲水印:DCT-QIM 从原理到踩坑
前端
程序0072 小时前
天地图实现收货地址定位
前端·javascript·css
去伪存真2 小时前
架构思考与演进:如何彻底破解 RAG 切块大小与语义完整性的工程悖论?
前端·agent