当前位置: 首页 > 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://jMAlsjzz.cszbj.cn
http://KN6kPtu9.cszbj.cn
http://AYMLoKpV.cszbj.cn
http://Rhoya2wz.cszbj.cn
http://oV2UdAS9.cszbj.cn
http://00AOdIzI.cszbj.cn
http://dzViD0hQ.cszbj.cn
http://5g13gyFf.cszbj.cn
http://8SQfYhgA.cszbj.cn
http://1AriGsVp.cszbj.cn
http://vp1Zw8TX.cszbj.cn
http://SHOR7VdP.cszbj.cn
http://vaDMIBx3.cszbj.cn
http://NfBBMrlZ.cszbj.cn
http://9tBXOaYQ.cszbj.cn
http://uTU9L0oD.cszbj.cn
http://bvQZhdNx.cszbj.cn
http://eEa2a2mJ.cszbj.cn
http://oqMB7s0Q.cszbj.cn
http://ACCeLxdj.cszbj.cn
http://CAMavlAv.cszbj.cn
http://BqlWzNf1.cszbj.cn
http://KnYHlgGY.cszbj.cn
http://GDhOBBZz.cszbj.cn
http://ySsWx3pf.cszbj.cn
http://D6uTuHcI.cszbj.cn
http://1TNs2MJM.cszbj.cn
http://fmEvaEMq.cszbj.cn
http://gcsnPHt0.cszbj.cn
http://rjup34bx.cszbj.cn
http://www.dtcms.com/a/175700.html

相关文章:

  • WPF MVVM入门系列教程(六、ViewModel案例演示)
  • 华为设备链路聚合实验:网络工程实战指南
  • Notepad++中XML格式化插件介绍
  • GPT与LLaMA:两大语言模型架构的深度解析与对比
  • console-chat-gpt开源程序是用于 AI Chat API 的 Python CLI
  • Android学习总结之Binder篇
  • Linux 下MySql主从数据库的环境搭建
  • RDK X5 交叉编译OSS\QT\opencv\openssl
  • 【Rust模块管理】Rust包、crate与模块管理
  • 深入探讨C++日志模块设计与实现
  • 华为昇腾910B通过vllm部署InternVL3-8B教程
  • 01 一文了解大数据存储框架:数据库、数据仓库、数据集市、数据网格、数据湖、数据湖仓
  • 设计一个分布式系统:要求全局消息顺序,如何使用Kafka实现?
  • 【面板数据】公开整理-各省刑事案件统计数据集(2011-2023年)
  • 锁相环HMC830的调试
  • taro的学习记录
  • MCP 入门指南
  • 2025软考【系统架构设计师】:两周极限冲刺攻略(附知识点解析+答题技巧)
  • mac 使用 Docker 安装向量数据库Milvus独立版的保姆级别教程
  • 固件测试:mac串口工具推荐
  • 【Pandas】pandas DataFrame expanding
  • 【神经网络与深度学习】VAE 和 GAN
  • 信息系统项目管理师-软考高级(软考高项)​​​​​​​​​​​2025最新(十一)
  • vue3父组件修改子组件的值
  • ESP32蓝牙开发笔记(十五)
  • Spring Boot 中的事务管理是如何工作的?
  • EEG设备的「减法哲学」:Mentalab Explore如何用8通道重构高质量脑电信号?
  • Qt 中信号与槽(signal-slot)机制支持 多种连接方式(ConnectionType)
  • 系统架构-云原生架构设计
  • Admyral - 可扩展的GRC工程自动化平台