【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关键字声明的变量可以在声明后重新赋值。

相关推荐
沙尘暴炒饭21 分钟前
vuex持久化vuex-persistedstate,存储的数据刷新页面后导致数据丢失
开发语言·前端·javascript
2401_8370885023 分钟前
CSS清楚默认样式
前端·javascript·css
前端大白话2 小时前
前端人速码!10个TypeScript神仙技巧,看完直接拿捏项目实战
前端·javascript·typescript
前端大白话2 小时前
前端必看!10个React实战技巧让你代码起飞,附超详细注释
前端·javascript·react.js
前端大白话2 小时前
前端必学!10 个超实用 Vue3 实战技巧大放送
前端·javascript·vue.js
谦谦橘子2 小时前
手写react-router,理解react-router原理
前端·javascript·react.js
zhu_zhu_xia2 小时前
JS通过GetCapabilities获取wms服务元数据信息并在SuperMap iClient3D for WebGL进行叠加显示
javascript·3d·webgl
BillKu2 小时前
Vue3父子组件数据同步方法
前端·javascript·vue.js
七月丶2 小时前
❌ 别再用接口文档开发了!我改用“Mock-First”后爽到飞起
前端·javascript·后端
七月丶3 小时前
🗑 写了 2000 行代码,结果自己全删了。
前端·javascript·后端