javascript的var与let,const之间的区别详解


Posted in Javascript onFebruary 18, 2022

说到JavaScript中声明变量的几种方法也就是varletconst了,letconstes6中新增的命令。那么它们之间有什么区别呢?

我们先整体说一下三者的区别,在详细介绍,var、let、const的区别主要从以下几点分析:

  • 作为全局变量时的不同
  • 变量提升
  • 暂时性死区
  • 块级作用域
  • 重复声明
  • 修改声明的变量

作为全局变量时

ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量,也是顶层变量的属性

但是ES6中用let声明的变量可以在全局访问到,但是并没有在顶层变量的属性上,const声明的常量同样也不会在顶层变量上

javascript的var与let,const之间的区别详解

变量提升

var声明的变量存在变量提升,及变量可以在声明之前调用,值为undefined

letconst不存在变量提升,即它们所声明的变量一定要在声明后使用,否则会报错

console.log(a)  // undefinedvar a = 1console.log(b)  // Cannot access 'b' before initializationlet b = 2console.log(c)  // Cannot access 'c' before initializationconst c = 3console.log(a)  // undefined
var a = 1

console.log(b)  // Cannot access 'b' before initialization
let b = 2

console.log(c)  // Cannot access 'c' before initialization
const c = 3

暂时性死区

var不存在暂时性死区

letconst存在暂时性死区,只有等到声明变量的那一行代码被执行后,才可以获取和使用该变量

其实这一点就是有上一点变量提升延伸而来的区别。因为var声明的变量存在变量提升,在声明之前使用该变量值为undefined,不会报错,所有没有暂时性死区。letconst在该作用域开始前后,变量或常量声明之前使用会报错,这一块区域也就被称为暂时性死区

例同上文:

console.log(a)  // undefined
var a = 1

console.log(b)  // Cannot access 'b' before initialization
let b = 2

console.log(c)  // Cannot access 'c' before initialization
const c = 3

块级作用域

var不存在块级作用域

letconst存在块级作用域

{    var a = 2}console.log(a)  // 2{    let b = 2}console.log(b)  // Uncaught ReferenceError: b is not defined{    const c = 2}console.log(c)  // Uncaught ReferenceError: c is not defined

重复声明

var在相同作用域下允许重复声明,后面声明的变量会覆盖前面的变量声明

letconst在相同作用域下不允许重复声明

var a = 10
var a = 20 // 20

let b = 10
let b = 20 // Identifier 'b' has already been declared

const c = 10
const c = 20 // Identifier 'c' has already been declared

修改声明的变量(常量与变量声明)

varlet声明的是变量,声明后的变量可被修改

const声明得失常量,只读。一旦声明,常量的值就不能改变。但是需要注意的是,对于引用数据类型,JavaScript中的变量或者常量存储的是该数据的存储地址,只要不直接修改该常量的引用,修改其指向的对象的属性是可以的。

var a = 10
a = 20
console.log(a)  // 20

let b = 10
b = 20
console.log(b)  // 20

const c = 10
c = 20 // Uncaught TypeError: Assignment to constant variable

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注三水点靠木的更多内容!

Javascript 相关文章推荐
js 设置选中行的样式的实现代码
May 24 Javascript
JavaScript中setAttribute用法介绍
Jul 20 Javascript
extjs中form与grid交互数据(record)的方法
Aug 29 Javascript
使用node.js半年来总结的 10 条经验
Aug 18 Javascript
JavaScript的arguments对象应用示例
Sep 15 Javascript
jQuery实现菜单式图片滑动切换
Mar 14 Javascript
JS构造函数与原型prototype的区别介绍
Jul 04 Javascript
创建一般js对象的几种方式
Jan 19 Javascript
基于JavaScript实现复选框的全选和取消全选
Feb 09 Javascript
React优化子组件render的使用
May 12 Javascript
微信小程序swiper禁止用户手动滑动代码实例
Aug 23 Javascript
在vue中使用防抖函数组件操作
Jul 26 Javascript
交互式可视化js库gojs使用介绍及技巧
gojs实现蚂蚁线动画效果
uni-app 微信小程序授权登录的实现步骤
Feb 18 #Javascript
详解TypeScript的基础类型
Feb 18 #Javascript
详解jQuery的核心函数和事件处理
Feb 18 #jQuery
JavaScript事件的委托(代理)的用法示例详解
Feb 18 #Javascript
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 #Vue.js
You might like
海贼王:最美的悬赏令!
2020/03/02 日漫
PHP会话控制:Session与Cookie详解
2014/09/27 PHP
PHP限制HTML内容中图片必须是本站的方法
2015/06/16 PHP
PHP+Mysql无刷新问答评论系统(源码)
2016/12/20 PHP
PHP读取Excel类文件
2017/05/15 PHP
PHP小白必须要知道的php基础知识(超实用)
2017/10/10 PHP
JS原型对象通俗"唱法"
2012/12/27 Javascript
Web跨浏览器进程通信(Web跨域)
2013/04/17 Javascript
js jq 单击和双击区分示例介绍
2013/11/05 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
NODE.JS跨域问题的完美解决方案
2016/10/20 Javascript
JS插件plupload.js实现多图上传并显示进度条
2016/11/29 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
2016/12/30 Javascript
JavaScript运动框架 解决防抖动问题、悬浮对联(二)
2017/05/17 Javascript
实例讲解JavaScript预编译流程
2019/01/24 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
layui添加动态菜单与选项卡
2019/07/26 Javascript
js实现点击烟花特效
2020/10/14 Javascript
[38:23]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第一场
2014/05/24 DOTA
[01:38]女王驾到——至宝魔廷新尊技能&特效展示
2020/06/16 DOTA
详解Python发送邮件实例
2016/01/10 Python
在MAC上搭建python数据分析开发环境
2016/01/26 Python
python僵尸进程产生的原因
2017/07/21 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
2020/11/28 Python
Html5自定义字体解决方法
2019/10/09 HTML / CSS
施华洛世奇匈牙利官网:SWAROVSKI匈牙利
2019/07/06 全球购物
职专应届生求职信
2013/11/16 职场文书
房地产资料员岗位职责
2014/07/02 职场文书
初婚初育证明范本
2014/11/24 职场文书
考博导师推荐信范文
2015/03/27 职场文书
2015财务年终工作总结范文
2015/05/22 职场文书
毕业生自我鉴定范文
2019/05/13 职场文书
python中的mysql数据库LIKE操作符详解
2021/07/01 MySQL
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js
python神经网络学习 使用Keras进行回归运算
2022/05/04 Python