網站首頁 前端文檔 正文
說到JavaScript
中聲明變量的幾種方法也就是var
、let
、const
了,let
和const
是es6
中新增的命令。那么它們之間有什么區別呢?
我們先整體說一下三者的區別,在詳細介紹,var、let、const的區別主要從以下幾點分析:
- 作為全局變量時的不同
- 變量提升
- 暫時性死區
- 塊級作用域
- 重復聲明
- 修改聲明的變量
作為全局變量時
在ES5
中,頂層對象的屬性和全局變量是等價的,用var
聲明的變量既是全局變量,也是頂層變量的屬性
但是ES6
中用let
聲明的變量可以在全局訪問到,但是并沒有在頂層變量的屬性上,const
聲明的常量同樣也不會在頂層變量上
變量提升
var
聲明的變量存在變量提升,及變量可以在聲明之前調用,值為undefined
let
和const
不存在變量提升,即它們所聲明的變量一定要在聲明后使用,否則會報錯
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
不存在暫時性死區
let
和const
存在暫時性死區,只有等到聲明變量的那一行代碼被執行后,才可以獲取和使用該變量
其實這一點就是有上一點變量提升延伸而來的區別。因為var
聲明的變量存在變量提升,在聲明之前使用該變量值為undefined
,不會報錯,所有沒有暫時性死區。let
、const
在該作用域開始前后,變量或常量聲明之前使用會報錯,這一塊區域也就被稱為暫時性死區
例同上文:
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
不存在塊級作用域
let
和const
存在塊級作用域
{ 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
在相同作用域下允許重復聲明,后面聲明的變量會覆蓋前面的變量聲明
let
、const
在相同作用域下不允許重復聲明
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
修改聲明的變量(常量與變量聲明)
var
和let
聲明的是變量,聲明后的變量可被修改
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
總結
原文鏈接:https://blog.csdn.net/wuxian_wj/article/details/122245154
相關推薦
- 2022-10-03 Docker啟動失敗報錯Failed?to?start?Docker?Application?Con
- 2022-05-07 redis實現分布式session的解決方案_Redis
- 2022-10-22 PostgreSql生產級別數據庫安裝要注意事項_PostgreSQL
- 2022-10-09 set_new_handler(0)有什么用_C 語言
- 2023-01-08 Android智能指針輕量級Light?Pointer初識_Android
- 2022-08-13 Android自定義ProgressBar實現漂亮的進度提示框_Android
- 2022-01-04 iframe父子頁面互相調用方法、獲取變量、獲取元素
- 2023-07-05 Redis性能瓶頸:如何優化大key問題?
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支