let/const/var的區別及理解

在JavaScript中,letconst?和?var?是用來聲明變量的關鍵字,但它們之間在作用域、變量提升、重復聲明等方面存在區別,詳細情況如下:

1.?letconstvar?的區別

(1) 塊級作用域
  • let?和?const:具有塊級作用域,由?{}?包括。這解決了ES5中內層變量可能覆蓋外層變量和循環變量泄露為全局變量的問題。

if(true){let a="hello world";console.log(a);//hello world
}
//console.log(a);//報錯,ReferenceError: a is not defined//因為let、const在塊外部不可見

  • var:不具備塊級作用域,只有函數作用域或全局作用域。

if(true){var b="hello world";console.log(b);//hello world
}
console.log(b);//hello world//因為var聲明的變量在函數作用域或全局作用域內有效
(2) 變量提升(var特有)
  • var:存在變量提升,即變量可以在聲明之前使用,但值為?undefined
console.log(x); // undefined
var x = 10;//因為var聲明的變量會被提升  
  • let?和?const:不存在變量提升,必須在聲明后才能使用,否則報錯。
console.log(y); // 報錯,ReferenceError: Cannot access 'y' before initialization
let y = 10;//因為let、const聲明的變量不會被提升  

(3) 全局屬性
  • var:聲明的全局變量會成為全局對象(瀏覽器中是?window,Node中是?global)的屬性。
  • let?和?const:不會將聲明的全局變量添加到全局對象的屬性上。
(4) 重復聲明
  • var:允許在同一作用域內重復聲明變量,后聲明的會覆蓋前面聲明的。
var c = 1;  
var c = 2;  
console.log(c); // 2
  • let?和?const:不允許在同一作用域內重復聲明變量。
let d = 1;  
let d = 2; // 報錯,SyntaxError: Identifier 'd' has already been declaredconst e = 1;  
// const e = 2; // 報錯//因為let、const不允許在同一作用域內重復聲明變量  
(5) 暫時性死區(let、const特有)
  • let?和?const:在聲明前使用會報錯,因為這段時間稱為暫時性死區。
if (true) {  console.log(f); // 報錯,因為f在聲明之前處于暫時性死區  let f = 'temporal dead zone';  
}  // const的情況與let相同,也會存在暫時性死區
  • var:不存在暫時性死區。
(6) 初始值設置
  • var?和?let:可以不設置初始值。
var g; // 未初始化 
console.log(g); // undefined  let h; // 未初始化,但在使用前必須聲明  
console.log(h); // undefined
  • const:必須設置初始值。
// const i; // 報錯,因為const必須設置初始值  
const j = 10;  
console.log(j); // 輸出 10
(7) 指針指向
  • let、var:創建的變量可以重新賦值,即可以更改指針指向。
  • const:聲明的變量不允許改變指針的指向,但如果是對象或數組,可以修改其內部屬性或元素。

2.?const?對象的屬性可以修改

const?保證的是變量指向的內存地址不變,即不能重新指向另一個對象或數組。

但對于對象或數組這樣的引用類型,const?只能確保引用(指針)不變,而不能保證對象內部狀態的不可變性。

因此,可以修改?const?聲明的對象的屬性或數組的元素。

const obj = { value: 10 };  
obj.value = 20; // 可以修改const聲明對象的屬性  
console.log(obj.value); // 20  // obj = { value: 30 }; // 報錯,因為嘗試改變了const聲明的對象的引用 

3.其他說明

(1)變量提升是var特有的,且只影響函數作用域或全局作用域;而暫時性死區是letconst特有的,與它們的塊級作用域緊密相關。

(2)const用于聲明一個只讀的常量。一旦一個常量被賦值后,它的值就不能再被改變。但是,如果常量是一個對象或數組,其內部狀態仍然可以被修改,只是常量指向的內存地址不能改變。使用const可以提高代碼的可讀性和可維護性,因為它明確表示了某些值是不應該被改變的。

(3)使用var在全局作用域中聲明的變量會自動成為全局對象(在瀏覽器中是window,在Node.js中是global)的屬性。這可能會導致意外的全局變量污染和命名沖突。所以使用letconst在全局作用域中聲明的變量則不會成為全局對象的屬性,這有助于減少全局命名空間的污染。

(4)由于letconst提供了更好的封裝和避免命名沖突的能力,它們通常被認為是更好的選擇。

總結

區別letconstvar
有無塊級作用域×
有無變量提升××
能否添加全局屬性××
能否重復聲明變量××
有無暫時性死區×
必須設置初始值××
能否改變指針指向×

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43878.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43878.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43878.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

百數教學秘籍:三步走,輕松規劃你的自動化計劃任務

通過設定任務計劃,用戶可以輕松安排指定的功能插件或數據助手在特定時間自動執行,有效提高工作效率,還確保了數據的及時更新和處理。任務計劃在應用啟動時自動啟動并在后臺運行,無需用戶持續監控,為用戶帶來極大的便利…

oracle哪些后臺進程不能殺?

oracle 有很多的后臺進程,在遇到特殊情況的時候如鎖表,如果等待的是一個后臺進程,那這時就需要考量是不是能殺掉這個后臺進程?殺掉這個后臺進程會不會引起實例崩潰?本著實踐出真知,本文針對oracle 11g&…

游戲開黑語音-使用云服務器部署teamspeak服務(系統Ubuntu 20.04 LTS)

目錄 前置物品服務器調整及部署1.重裝系統2.換源3.下載teamspeak服務端并部署 連接服務器參考 前置物品 一臺云服務器(系統:Ubuntu 20.04 LTS) 服務器調整及部署 1.重裝系統 在騰訊云官網的主機控制臺內,選擇重裝系統 (由于之前為了快點和…

【刷題匯總 -- 最長回文子串、買賣股票的最好時機(一)、[NOIP2002 普及組] 過河卒】

C日常刷題積累 今日刷題匯總 - day0101、最長回文子串1.1、題目1.2、思路1.3、程序實現 2、買賣股票的最好時機(一)2.1、題目2.2、思路2.3、程序實現2.4、程序實現 -- 優化 3、[NOIP2002 普及組] 過河卒3.1、題目3.2、思路3.3、程序實現 -- dp 4、題目鏈接 今日刷題匯總 - day0…

Excel中用VBA實現Outlook發送當前工作簿

Excel中用VBA實現Outlook發送當前工作簿,首先按AltF11打開VBA編輯器,插入模塊,并在工具-引用中勾選 Microseft Outlook .0 Object Library(其中為你Microseft Outlook的版本號。 Sub 發送郵件() 保存當前excel ThisWorkbook.Save讓excel連接…

Linux 入門教程 by 程序員魚皮

本文作者:程序員魚皮 免費編程學習 - 編程導航網:https://www.code-nav.cn 大家好,我是魚皮。 前兩天我學編程的老弟小阿巴過生日,我問他想要什么禮物。 本來以為他會要什么游戲機、Q 幣卡、鼠標鍵盤啥的,結果小阿巴…

模擬防止重復提交

gitee地址(需要自取)AopProxy重復提交: 防止重復提交 (gitee.com) RestController public class SubmissionController {Autowiredprivate SubmissionService submissionService;private static Jedis jedis new Jedis("localhost",6379);pr…

短視頻矩陣:批量發布的秘密揭秘

在數字化時代,短視頻已經成為一種廣受歡迎的媒體形式。無論是用于品牌推廣、產品營銷還是個人創作,短視頻都提供了一種直觀、生動的方式來吸引觀眾的注意力。然而,有效地制作、管理和發布短視頻對于許多創作者和企業來說是一個挑戰。 為此&am…

什么是 C 語言中的宏定義?

🍅關注博主🎗? 帶你暢游技術世界,不錯過每一次成長機會! 📙C 語言百萬年薪修煉課程 通俗易懂,深入淺出,匠心打磨,死磕細節,6年迭代,看過的人都說好。 文章目…

解決 Yarn 運行時的 Node.js 版本問題:一個詳盡的指南

引言 Yarn 是一個流行的 JavaScript 包管理器,它與 Node.js 緊密集成,用于管理項目依賴。然而,在開發過程中,開發者可能會遇到 Node.js 版本不兼容的問題,這會導致 Yarn 運行時出錯。本文將提供一個詳細的指南&#x…

動態規劃之數字三角形模型+最長上升子序列模型

首先,我們從集合角度重新看待DP: 直接看題:https://www.acwing.com/problem/content/1029/ 就是取紙條的原題,我們令f[i1,j1,i2,j2]表示從(1,1),(1,1)分別走到(i1,j1),(i2,j2)的路徑的max i1j1i2j2,于是我們可以把狀…

機器學習 | 對K-Means聚類假設的研究演示及實踐示例

我們在Scikit-learn對K-means假設的調查中探索了揭示算法優勢和局限性的場景。我們研究了K-means對不正確的聚類大小的敏感性,它在各向異性分布中面臨的困難,它在不同的聚類方差中面臨的困難,以及使用合成數據集的大小不均勻的聚類問題。我們…

準備工作+1、請求和響應+2、模型和管理站點

Django快速入門——創建一個基本的投票應用程序 準備工作1、創建虛擬環境2、安裝django 1、請求和響應(1)創建項目(2)用于開發的簡易服務器(3)創建投票應用(4)編寫第一個視圖1、編寫…

家用激光投影儀品牌排行榜:這幾個品牌口碑好產品好最適合家用

現在人們生活水平提升,對投影這類產品的認知接受度也提升,有條件的家庭都想在家里整一個家庭影院,對于這些消費者來說挑選一臺性價比高的家用投影至關重要,既省到錢又買對了產品;投影市場發展迅速目前市面上大大小小的…

華為機考真題 -- 多段線數據壓縮

題目描述: 下圖中,每個方塊代表一個像素,每個像素用其行號和列號表示,但可以發現,這種表示不是最簡的,其實只需要存儲 6 個藍色的關鍵點即可,它們是線段的起點、拐點、終點,而剩下 4 個點是冗余的。現在,請根據輸入的包含有冗余數據的多段線坐標列表,輸出其最簡化的…

mongo數據庫遷移

前言 mongo數據庫遷移的方式目前常見的有兩種: 1,mongodump與mongorestore 2,mongoimport與mongoexport 二者主要區別有: 1、mongoexport 可以導出json和csv格式, mongodump導出的是bson可讀性不如前者 2,…

在Windows 10上快速顯示桌面的幾種方法,總有一種適合你

序言 有時你需要在Windows 10中快速查看你的桌面,但你不想乏味地最小化每個打開的應用程序窗口,或者移動它們并丟失它們的布局。幸運的是,有幾種方法可以讓你快速查看桌面,然后從你停止的地方重新開始。 如何使用任務欄按鈕顯示桌面 假設你正在隨意瀏覽你最喜歡的網站,…

服了,jenkins找不到advanced

新手下載的最新版本,過新手入門的時候一直過不去,就跳過了。 想下載一個漢化,還下載不了。根據提示搜索,結果大家讓去advanced找url,也找不到。

nginx重啟命令linux步驟是什么?

1、驗證nginx配置文件是否正確 方法一:進入nginx安裝目錄sbin下,輸入命令./nginx -t 看到如下顯示nginx.conf syntax is ok nginx.conf test is successful 說明配置文件正確! 方法二:在啟動命令-c前加-t 2、重啟Nginx服務 方法一&#xff1a…

FreeRTOS 隊列

隊列是一種任務到任務、任務到中斷、中斷到任務數據交流的一種機制。在隊列中可以存 儲數量有限、大小固定的多個數據,隊列中的每一個數據叫做隊列項目,隊列能夠存儲隊列項 目的最大數量稱為隊列的長度,在創建隊列的時候,就需要指…