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 相关文章推荐
理解Javascript_01_理解内存分配原理分析
Oct 11 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
Jan 04 Javascript
jQuery绑定事件on()与弹窗的简要概述
Apr 27 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
May 23 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
Jul 27 Javascript
AngularJS基础 ng-options 指令详解
Aug 02 Javascript
树结构之JavaScript
Jan 24 Javascript
JavaScript函数绑定用法实例分析
Nov 14 Javascript
简单了解JavaScript异步
May 23 Javascript
使用Karma做vue组件单元测试的实现
Jan 16 Javascript
微信小程序实现点击生成随机验证码
Sep 09 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
Oct 02 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
php多任务程序实例解析
2014/07/19 PHP
PHP多文件上传实例
2015/07/09 PHP
php实现仿写CodeIgniter的购物车类
2015/07/29 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
CI框架AR数据库操作常用函数总结
2016/11/21 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
2020/05/01 PHP
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
jQuery插件zTree实现的基本树与节点获取操作示例
2017/03/08 Javascript
react实现pure render时bind(this)隐患需注意!
2017/03/09 Javascript
关于Stream和Buffer的相互转换详解
2017/07/26 Javascript
webpack引入eslint配置详解
2018/01/22 Javascript
jQuery中each遍历的三种方法实例分析
2018/09/07 jQuery
微信小程序购物车、父子组件传值及calc的注意事项总结
2018/11/14 Javascript
详细讲解如何创建, 发布自己的 Vue UI 组件库
2019/05/29 Javascript
vue pages 多入口项目 + chainWebpack 全局引用缩写说明
2020/09/21 Javascript
node.js 基于 STMP 协议和 EWS 协议发送邮件
2021/02/14 Javascript
python使用cStringIO实现临时内存文件访问的方法
2015/03/26 Python
使用Python进行AES加密和解密的示例代码
2018/02/02 Python
pygame实现俄罗斯方块游戏(AI篇1)
2019/10/29 Python
pycharm设置当前工作目录的操作(working directory)
2020/02/14 Python
Python绘制动态水球图过程详解
2020/06/03 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
使用Keras建立模型并训练等一系列操作方式
2020/07/02 Python
香港个人化生活购物网站:Ballyhoo Limited
2016/09/10 全球购物
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
BIBLOO捷克:购买女装、男装、童装、鞋和配件
2017/01/27 全球购物
俄罗斯茶和咖啡网上商店:Tea.ru
2021/01/26 全球购物
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
5.1手机促销活动
2014/01/17 职场文书
社区综治宣传月活动总结
2014/07/02 职场文书
2016幼儿园中班开学寄语
2015/12/03 职场文书