当前位置: 首页 > news >正文

var、let、const的区别

1. var
在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量即是全局变量,也是顶层变量,在浏览器中顶层对象指的是window对象,在node中顶层对象指的是global对象。

console.log(a) // undefined
var a = 1
console.log(window.a) // 1
function get() {var a = 2b = 3 // 全局变量
}
get()
console.log(a) // 1
{var c = 3
}
console.log(c) // 3

使用var存在变量提升;
使用var能够对一个变量进行多次声明,后面声明的变量会覆盖前面的变量声明;
在函数中使用var声明变量时候,该变量是局部的,而如果在函数内不使用var则该对象是全局的;
2. let
let是ES6新增的命令用来声明变量,用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效,不存在变量提升,只要块级作用域内存在let命令,这个区域就不再受外部影响,并且let不允许在相同的作用域中重复声明;
也不能在函数内部重新声明参数;

{console.log(a) // 报错referenceErrorlet a = 1let a = 2 // uncaught SyntaxError: a has already been declared
}
console.log(a) // referenceError: a is not defined
function get(arg) {let arg 
}
get() // uncaught SyntaxError: arg has already been declared

3. const
const声明一个只读变量,一旦声明,常量的值就不能改变;这就意味着const一旦变量声明,就必须立即初始化,不能留到以后赋值;

const a = 1
a = 2 // typeError: assigment to constant variable
const obj = {}
obj.a = 1
obj = {} // typeError: obj is read-only

const实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动,对于简单类型的数据,值就保存在变量指向的那个内存地址,对于复杂类型的数据,变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的,并不能确保改变量的结构不变。

4. 区别

  • 变量提升:var可以变量提升,let和const不存在变量提升;
  • 暂时性死区:var不存在暂时性死区,let和const存在暂时性死区,只有等到变量声明的那一行代码出现,才可以获取和使用变量;
  • 块级作用域:var不存在块级作用域,let和const存在块级作用域;
  • 重复声明:var可以重复声明变量,let和const不允许重复声明变量;
  • 修改声明的变量:var和let可以修改,const声明一个只读的常量,一旦声明,常量的值就不能改变;
  • 使用场景:能用const的情况尽量使用const,其他情况下大多数属于let,避免使用var。
http://www.xdnf.cn/news/319087.html

相关文章:

  • 高并发内存池(一):项目简介+定长内存池的实现
  • ACE-Step - 20秒生成4分钟完整歌曲,音乐界的Stable Diffusion,支持50系显卡 本地一键整合包下载
  • MySQL 8.0 OCP(1Z0-908)英文题库(1-10)
  • PyTorch常用命令(可快速上手PyTorch的核心功能,涵盖从数据预处理到模型训练的全流程)
  • 【RabbitMQ可靠性原理】
  • 亚远景-ASPICE vs ISO 21434:汽车软件开发标准的深度对比
  • YOLOv8的Python基础--函数篇2
  • WordPress:Locoy.php火车头采集
  • 【HTTP】《HTTP 全原理解析:从请求到响应的奇妙之旅》
  • 【MongoDB篇】MongoDB的副本集操作!
  • 数据清洗-电商双11美妆数据分析(二)
  • 5G赋能农业物联网:智能化种植的新纪元
  • JavaWeb:MySQL进阶
  • 趣味编程:梦幻万花筒
  • DBa作业
  • MCP认证全解析:从零到微软认证专家
  • (eNSP)策略路由实验配置
  • Selenium Web自动化测试学习笔记(二)--八大元素定位
  • 详细剖析传输层协议(TCP和UDP)
  • Baumer工业相机堡盟工业相机如何通过BGAPI SDK在Linux系统下设置多个USB相机(C++)
  • 3、食品包装控制系统 - /自动化与控制组件/food-packaging-control
  • 如何在Ubuntu上安装NVIDIA显卡驱动?
  • leetcode 141. Linked List Cycle
  • AtCoder Regular Contest 197 Div2 A,B题解
  • 实验六 基于Python的数字图像压缩算法
  • 全自动舆情监控系统实现方案
  • 在地震资料柯希霍夫积分法深度偏移大规模成像中,五维旅行时表高效处理策略
  • Spring MVC中Controller是如何把数据传递给View的?
  • 自由浮动时间和总浮动时间对比
  • 学习整理使用php将SimpleXMLElement 对象解析成数组格式的方法