【ES6】让你彻底搞懂const ,let和var的区别

前言

想必许多学习JS的同学都被const、let和var搞得晕头转向,一直傻傻分不清这三者的区别,本文将全面阐述清这三者的前世今生。

首先,说到JS就不得不提到他的好兄弟ECMAScript,ECMAScript是一个国际通过的标准化脚本语言。JavaScript由ECMAScript和DOM、BOM三者组成。可以简单理解为:ECMAScript是JavaScript的语言规范,JavaScript是ECMAScript的实现和扩展。

2011年,ECMAScript 5.1版发布,之前大部分人用的也就是ES5。

2015年6月,ECMAScript 6 正式通过,成为国际标准,而let和const也就是这个时候出现在大众视野。

var

  • var是在ES5中引入的变量关键字
  • 函数作用域:在函数内部声明的变量只在该函数内可见
js 复制代码
function test() {
  var num = 10;
  console.log(num);
}
test(); // 打印结果为num = 10

console.log(num); // 报错:num is not defined
  • 如果在同一个作用域内使用var多次声明同名变量,后面的变量会覆盖前面的
js 复制代码
var age = 10;
var age = 20;
console.log(age);//age = 20
  • var声明的变量可以在声明之前被访问(变量提升),但是在变量声明之前使用它,其值会是 undefined
js 复制代码
console.log(num);
var num = 10;// undefined

let

  • 块作用域:在{}块内声明的变量只在该块内可见
js 复制代码
let num = 10;
if (true) {
  let num = 20;
  console.log(num);// 打印结果为num = 20
}
console.log(num);// 打印结果为num = 10
  • 不允许重复声明,在同一作用域内不能重复声明同一个变量,否则会报错
js 复制代码
if (true) {
  let num = 20; 
  let num = 30; // SyntaxError: Identifier 'num' has already been declared
  console.log(num);
}
  • 暂时性死区:在块作用域里,变量在声明前是不可访问的
js 复制代码
if (true) {
  console.log(num); // ReferenceError: Cannot access 'num' before initialization
  let num = 10;
}

const

  • 块作用域:和let差不多
js 复制代码
const num = 10;
if (true) {
  const num = 20;
  console.log(num); // 20
}
console.log(num); // 10
  • 不允许重复声明,必须初始化,定义变量时赋值,一旦赋值后就不能重新赋值
js 复制代码
const num = 10
const num = 20 // SyntaxError: Identifier 'num' has already been declared
  • 对于基本数据类型,一旦赋值不能更改,对于复合数据类型(对象,数组),不能改变其内存地址,但是能改变这个对象或数组的内容
js 复制代码
const obj = { a: 1 }
obj.a = 2 // 合法,因为修改的是对象的内容
console.log(obj); // 输出 {a: 2}

const arr = [1, 2, 3]
arr.push(4) // 合法,因为修改的是数组的内容
console.log(arr); // 输出 [1,2,3,4]

const num = 10
num = 20 // 抛出 TypeError: Assignment to constant variable.

小结

constletvar都是声明变量的关键字,他们有以下几个方面的区别:

1.重复声明:var可以在同一作用域内重复声明变量,constlet不行。

2.作用域:constlet都是块级作用域,var是函数作用域

3.变量提升:var具有变量提升的特点,constlet不具有该特点 ,在使用var关键字声明变量时,变量声明会被提升到作用域顶部,因此可以在变量声明之前访问变量;而在使用constlet关键字声明变量时,访问未声明和未初始化的变量会抛出ReferenceError异常。

4.赋值:使用const关键字声明的变量必须在声明时进行初始化,并且初始化后不能再修改变量的值(复合数据类型的值可以发生改变,但不可以改变类型);而使用let关键字声明的变量可以在声明后重新赋值。

相关推荐
低代码布道师2 分钟前
第五部分:第一节 - Node.js 简介与环境:让 JavaScript 走进厨房
开发语言·javascript·node.js
满怀101533 分钟前
【Vue 3全栈实战】从响应式原理到企业级架构设计
前端·javascript·vue.js·vue
伟笑1 小时前
elementUI 循环出来的表单,怎么做表单校验?
前端·javascript·elementui
确实菜,真的爱1 小时前
electron进程通信
前端·javascript·electron
魔术师ID3 小时前
vue 指令
前端·javascript·vue.js
Clown954 小时前
Go语言爬虫系列教程 实战项目JS逆向实现CSDN文章导出教程
javascript·爬虫·golang
星空寻流年4 小时前
css3基于伸缩盒模型生成一个小案例
javascript·css·css3
waterHBO5 小时前
直接从图片生成 html
前端·javascript·html
EndingCoder6 小时前
JavaScript 时间转换:从 HH:mm:ss 到十进制小时及反向转换
javascript
互联网搬砖老肖6 小时前
React组件(一):生命周期
前端·javascript·react.js