最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中三種變量聲明方式var、let、const的區(qū)別與實(shí)戰(zhàn)指南

 更新時(shí)間:2026年03月30日 09:41:50   作者:Han.miracle  
本文解釋了JavaScript中const、var和let的區(qū)別,從作用域、變量提升、可重復(fù)聲明、可修改性等方面進(jìn)行對(duì)比,建議優(yōu)先使用const聲明不需要修改的變量,使用let聲明需要修改的變量,完全避免使用var,需要的朋友可以參考下

要理解 constvar、let 的區(qū)別,我們可以從 作用域、變量提升、可重復(fù)聲明、可修改性 這幾個(gè)核心維度展開(kāi),這些也是新手最容易混淆的點(diǎn)。

一、核心概念鋪墊

首先明確兩個(gè)基礎(chǔ)概念,能幫你更好理解區(qū)別:

  • 函數(shù)作用域:變量只在聲明它的函數(shù)內(nèi)部可訪(fǎng)問(wèn)(var 是函數(shù)作用域)。
  • 塊級(jí)作用域:變量只在聲明它的 {} 內(nèi)部可訪(fǎng)問(wèn)(let/const 是塊級(jí)作用域,{} 包括 if/for/while/ 普通代碼塊)。
  • 變量提升:JS 引擎在執(zhí)行代碼前,會(huì)把變量聲明 “提升” 到當(dāng)前作用域頂部(但賦值不會(huì)提升)。

二、逐個(gè)拆解 + 對(duì)比

1. var(ES5 語(yǔ)法)

var 是 ES5 中聲明變量的方式,特性如下:

  • 作用域:函數(shù)作用域(無(wú)塊級(jí)作用域)。
  • 變量提升:聲明會(huì)被提升,且提升后默認(rèn)值為 undefined
  • 可重復(fù)聲明:同一作用域內(nèi)可重復(fù)聲明同一個(gè)變量,后聲明的會(huì)覆蓋前一個(gè)。
  • 可修改:聲明后可隨意修改值。

示例代碼

// 1. 函數(shù)作用域(無(wú)塊級(jí)作用域)
if (true) {
  var a = 10;
}
console.log(a); // 輸出 10(a 跳出了 if 的 {},因?yàn)?var 無(wú)塊級(jí)作用域)

// 2. 變量提升
console.log(b); // 輸出 undefined(聲明提升了,賦值沒(méi)提升)
var b = 20;

// 3. 可重復(fù)聲明
var c = 30;
var c = 40;
console.log(c); // 輸出 40(后聲明的覆蓋前一個(gè))

// 4. 可修改
var d = 50;
d = 60;
console.log(d); // 輸出 60

2. let(ES6 語(yǔ)法)

let 是 ES6 為解決 var 的缺陷新增的聲明方式,特性如下:

  • 作用域:塊級(jí)作用域(被 {} 限制)。
  • 變量提升:存在 “暫時(shí)性死區(qū)(TDZ)”—— 聲明也會(huì)提升,但提升后不會(huì)賦值 undefined,在聲明前訪(fǎng)問(wèn)會(huì)報(bào)錯(cuò)。
  • 不可重復(fù)聲明:同一作用域內(nèi)不能重復(fù)聲明同一個(gè)變量(包括不能和 var/const 重復(fù))。
  • 可修改:聲明后可修改值。

示例代碼

// 1. 塊級(jí)作用域
if (true) {
  let a = 10;
}
console.log(a); // 報(bào)錯(cuò):a is not defined(a 被 if 的 {} 限制,外部訪(fǎng)問(wèn)不到)

// 2. 暫時(shí)性死區(qū)
console.log(b); // 報(bào)錯(cuò):Cannot access 'b' before initialization
let b = 20;

// 3. 不可重復(fù)聲明
let c = 30;
// let c = 40; // 報(bào)錯(cuò):Identifier 'c' has already been declared
// var c = 40; // 同樣報(bào)錯(cuò)

// 4. 可修改
let d = 50;
d = 60;
console.log(d); // 輸出 60

3. const(ES6 語(yǔ)法)

const 用于聲明常量,特性和 let 基本一致,核心區(qū)別是不可修改

  • 作用域:塊級(jí)作用域(和 let 完全一樣)。
  • 變量提升:同樣有暫時(shí)性死區(qū)(和 let 完全一樣)。
  • 不可重復(fù)聲明:和 let 完全一樣。
  • 不可修改:聲明時(shí)必須賦值,且賦值后不能修改引用(注意:如果是對(duì)象 / 數(shù)組,內(nèi)部屬性 / 元素可修改)。

示例代碼

// 1. 塊級(jí)作用域
if (true) {
  const a = 10;
}
console.log(a); // 報(bào)錯(cuò):a is not defined

// 2. 暫時(shí)性死區(qū)
console.log(b); // 報(bào)錯(cuò):Cannot access 'b' before initialization
const b = 20;

// 3. 不可重復(fù)聲明
const c = 30;
// const c = 40; // 報(bào)錯(cuò)

// 4. 聲明時(shí)必須賦值
// const d; // 報(bào)錯(cuò):Missing initializer in const declaration

// 5. 不可修改引用(重點(diǎn))
const e = 50;
// e = 60; // 報(bào)錯(cuò):Assignment to constant variable.

// 注意:對(duì)象/數(shù)組的內(nèi)部可修改(只是引用不能變)
const obj = { name: "張三" };
obj.name = "李四"; // 正常執(zhí)行,輸出 { name: '李四' }
console.log(obj);

const arr = [1, 2];
arr.push(3); // 正常執(zhí)行,輸出 [1,2,3]
console.log(arr);

三、核心區(qū)別對(duì)比表

特性varletconst
作用域函數(shù)作用域塊級(jí)作用域塊級(jí)作用域
變量提升有(提升為 undefined)有(暫時(shí)性死區(qū))有(暫時(shí)性死區(qū))
重復(fù)聲明允許不允許不允許
聲明后賦值允許(默認(rèn) undefined)允許(默認(rèn)未初始化)不允許(必須立即賦值)
修改值允許允許引用不可改(對(duì)象 / 數(shù)組內(nèi)部可改)

四、實(shí)際開(kāi)發(fā)中的使用建議

  1. 優(yōu)先用 const:聲明不需要修改的變量(如常量、固定引用的對(duì)象 / 數(shù)組),能減少代碼意外修改的風(fēng)險(xiǎn)。
  2. 其次用 let:聲明需要修改的變量(如循環(huán)變量、狀態(tài)變量)。
  3. 完全不用 varvar 的函數(shù)作用域和變量提升容易導(dǎo)致 bug(比如循環(huán)變量泄露、重復(fù)聲明覆蓋),ES6 后已被 let/const 替代。

五、let 和 const  取代var

letconst 是 ES6 新增的變量聲明方式,核心是解決 var 的作用域和提升問(wèn)題,它們的使用場(chǎng)景可以用一句話(huà)概括:優(yōu)先用 const,需要修改時(shí)用 let。下面結(jié)合具體場(chǎng)景和代碼示例,幫你徹底分清什么時(shí)候用哪個(gè)。

(一)、const 的使用場(chǎng)景(優(yōu)先選擇)

const 聲明的是引用不可變的變量(聲明時(shí)必須賦值,且不能重新賦值),適合以下所有 “不需要修改值 / 引用” 的場(chǎng)景:

1. 聲明常量(固定不變的值)

比如數(shù)學(xué)常量、配置項(xiàng)、固定字符串等,用 const 能明確表示 “這個(gè)值不會(huì)變”,減少代碼意外修改的風(fēng)險(xiǎn)。

// 數(shù)學(xué)常量
const PI = 3.1415926;
const RADIUS = 5;
const AREA = PI * RADIUS * RADIUS; // 計(jì)算后的值也不變

// 配置項(xiàng)(固定的接口地址、密鑰等)
const BASE_URL = 'https://api.example.com';
const TOKEN = 'abc123456';

// 固定字符串
const TITLE = '個(gè)人信息'; // 就像你之前寫(xiě)的標(biāo)題文本

2. 聲明不需要重新賦值的對(duì)象 / 數(shù)組

注意:const 只是限制 “引用不可變”,對(duì)象 / 數(shù)組的內(nèi)部屬性 / 元素可以修改,這種場(chǎng)景非常適合用 const(因?yàn)槟阒皇遣僮鲀?nèi)部,不會(huì)重新賦值整個(gè)對(duì)象 / 數(shù)組)。

// 個(gè)人信息對(duì)象(只會(huì)改內(nèi)部屬性,不會(huì)重新賦值)
const userInfo = {
  name: '韓雨龍',
  class: '24專(zhuān)本軟件',
  hobby: ['唱歌', '跳舞']
};
// 允許修改內(nèi)部屬性(符合 const 規(guī)則)
userInfo.name = '小雨'; 
userInfo.hobby.push('爬山');

// 列表數(shù)據(jù)(只會(huì)增刪元素,不會(huì)重新賦值數(shù)組)
const list = ['蘋(píng)果', '香蕉'];
list.push('橙子'); // 正常執(zhí)行

3. 聲明 DOM 元素(創(chuàng)建后不會(huì)重新賦值)

就像你之前寫(xiě)的創(chuàng)建 h2 元素,創(chuàng)建后只會(huì)修改它的文本 / 樣式,不會(huì)重新賦值成另一個(gè)元素,所以用 const 最合適。

// 創(chuàng)建 h2 元素(不會(huì)重新賦值,用 const)
const h2 = document.createElement('h2');
h2.textContent = '個(gè)人信息'; // 只是修改屬性,不是重新賦值
document.body.appendChild(h2);

// 創(chuàng)建按鈕元素(同理)
const btn = document.createElement('button');
btn.textContent = '點(diǎn)擊';
document.body.appendChild(btn);

(二)、let 的使用場(chǎng)景(僅當(dāng)需要修改時(shí))

let 聲明的是可重新賦值的變量,只有當(dāng)你需要 “修改變量的值 / 引用” 時(shí),才用 let,常見(jiàn)場(chǎng)景如下:

1. 循環(huán)變量(值會(huì)不斷變化)

for/while 循環(huán)中的計(jì)數(shù)器(比如 i),每次循環(huán)都會(huì)修改值,必須用 let(不能用 const,因?yàn)?i++ 是重新賦值)。

// for 循環(huán)計(jì)數(shù)器(i 會(huì)從 0 變到 4,需要修改)
const info = ['班級(jí)', '學(xué)號(hào)', '姓名', '性別', '愛(ài)好'];
for (let i = 0; i < info.length; i++) {
  const p = document.createElement('p');
  p.textContent = info[i];
  document.body.appendChild(p);
}

// while 循環(huán)變量
let count = 0;
while (count < 3) {
  console.log('計(jì)數(shù):', count);
  count++; // 重新賦值,必須用 let
}

2. 狀態(tài)變量(值會(huì)動(dòng)態(tài)變化)

比如開(kāi)關(guān)狀態(tài)、計(jì)數(shù)器、表單輸入值等,這些值會(huì)隨著操作(點(diǎn)擊、輸入)變化,需要用 let。

// 開(kāi)關(guān)狀態(tài)(點(diǎn)擊按鈕切換 true/false)
let isShow = false;
const btn = document.createElement('button');
btn.textContent = '顯示/隱藏';
btn.onclick = function() {
  isShow = !isShow; // 重新賦值,用 let
  console.log('狀態(tài):', isShow);
};
document.body.appendChild(btn);

// 計(jì)數(shù)器(點(diǎn)擊一次加 1)
let num = 0;
const countBtn = document.createElement('button');
countBtn.textContent = '計(jì)數(shù)';
countBtn.onclick = function() {
  num++; // 重新賦值,用 let
  countBtn.textContent = `計(jì)數(shù):${num}`;
};
document.body.appendChild(countBtn);

3. 臨時(shí)變量(需要重新賦值)

比如分步計(jì)算的值、條件判斷后需要修改的變量,這些場(chǎng)景需要多次賦值。

// 分步計(jì)算總價(jià)
let total = 0;
total += 10; // 加商品1價(jià)格
total += 20; // 加商品2價(jià)格
total *= 0.8; // 打8折(多次重新賦值,用 let)
console.log('總價(jià):', total);

// 條件賦值(根據(jù)條件修改變量)
let message = '';
const isLogin = false;
if (isLogin) {
  message = '歡迎登錄';
} else {
  message = '請(qǐng)先登錄'; // 重新賦值,用 let
}

(三)、避坑提醒(新手常錯(cuò))

  1. ? 錯(cuò)誤:用 const 聲明需要修改的變量
const i = 0;
i++; // 報(bào)錯(cuò):Assignment to constant variable.(const 不能重新賦值)
  1. ? 錯(cuò)誤:沒(méi)必要用 let 聲明不修改的變量
// 標(biāo)題文本不會(huì)改,應(yīng)該用 const 而不是 let
let TITLE = '個(gè)人信息'; 

總結(jié)

  1. 優(yōu)先用 const:所有不需要重新賦值的場(chǎng)景(常量、對(duì)象 / 數(shù)組、DOM 元素、固定字符串等),用 const 能讓代碼更安全、語(yǔ)義更清晰。
  2. 僅用 let:只有當(dāng)變量需要重新賦值時(shí)(循環(huán)變量、狀態(tài)變量、臨時(shí)變量等),才用 let。
  3. 核心原則:能不用 let 就不用,用 const 約束 “不變”,用 let 表示 “可變”,徹底拋棄 var

以上就是JavaScript中三種變量聲明方式var、let、const的區(qū)別與實(shí)戰(zhàn)指南的詳細(xì)內(nèi)容,更多關(guān)于JavaScript變量聲明方式var、let、const的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

潢川县| 阳新县| 龙川县| 凤翔县| 沾化县| 吉木萨尔县| 博爱县| 大渡口区| 峨眉山市| 晋宁县| 忻城县| 丹棱县| 疏勒县| 雅江县| 桐梓县| 舞钢市| 义乌市| 铅山县| 金坛市| 锡林浩特市| 峡江县| 汕尾市| 马公市| 辽源市| 柯坪县| 峨边| 青岛市| 乐平市| 兴仁县| 布拖县| 兖州市| 马关县| 永嘉县| 灯塔市| 西昌市| 阳高县| 菏泽市| 会泽县| 宜兰县| 利川市| 盖州市|