在JavaScript中添谊,const
、let
和 var
都可以用來(lái)聲明變量察迟,但它們?cè)谛袨楹妥饔糜蛏嫌酗@著的區(qū)別:
1. 作用域(Scope)
關(guān)鍵詞 |
作用域 |
var |
函數(shù)作用域斩狱。聲明的變量在整個(gè)函數(shù)內(nèi)可用耳高。 |
let |
塊作用域。變量只在花括號(hào) {} 內(nèi)有效喊废。 |
const |
塊作用域祝高。與 let 一樣栗弟,限定在塊內(nèi)污筷。 |
示例:
function testVar() {
if (true) {
var x = 10; // 函數(shù)作用域
}
console.log(x); // 10
}
function testLet() {
if (true) {
let y = 20; // 塊作用域
}
console.log(y); // 報(bào)錯(cuò):y is not defined
}
testVar();
testLet();
2. 重新賦值(Reassignment)
關(guān)鍵詞 |
是否可重新賦值 |
var |
可以 |
let |
可以 |
const |
不可以(值不能被重新賦值) |
示例:
var a = 1;
a = 2; // 可以
let b = 1;
b = 2; // 可以
const c = 1;
c = 2; // 報(bào)錯(cuò):Assignment to constant variable.
3. 重新聲明(Redeclaration)
關(guān)鍵詞 |
是否可重新聲明 |
var |
可以 |
let |
不可以 |
const |
不可以 |
示例:
var x = 1;
var x = 2; // 可以,沒(méi)問(wèn)題
let y = 1;
let y = 2; // 報(bào)錯(cuò):Identifier 'y' has already been declared
const z = 1;
const z = 2; // 報(bào)錯(cuò):Identifier 'z' has already been declared
4. 變量提升(Hoisting)
關(guān)鍵詞 |
是否存在變量提升 |
var |
是乍赫,變量會(huì)提升瓣蛀,但值為 undefined
|
let |
是,但在聲明前使用會(huì)報(bào)錯(cuò)(暫時(shí)性死區(qū)) |
const |
是雷厂,但在聲明前使用會(huì)報(bào)錯(cuò)(暫時(shí)性死區(qū)) |
示例:
console.log(a); // undefined
var a = 5;
console.log(b); // 報(bào)錯(cuò):Cannot access 'b' before initialization
let b = 10;
console.log(c); // 報(bào)錯(cuò):Cannot access 'c' before initialization
const c = 15;
5. const
特別之處
-
const
聲明的變量不能重新賦值惋增,但如果是對(duì)象或數(shù)組,其內(nèi)部的內(nèi)容是可以更改的改鲫。
示例:
const obj = { name: "Alice" };
obj.name = "Bob"; // 可以修改對(duì)象屬性
const arr = [1, 2, 3];
arr.push(4); // 可以修改數(shù)組內(nèi)容
obj = {}; // 報(bào)錯(cuò):Assignment to constant variable.
總結(jié)
-
var
:適用于函數(shù)作用域的變量诈皿,但容易引發(fā)作用域混亂和意外錯(cuò)誤,現(xiàn)代開(kāi)發(fā)中不推薦使用像棘。
-
let
:塊級(jí)作用域變量稽亏,推薦使用。
-
const
:塊級(jí)作用域缕题,聲明后不能重新賦值截歉,適用于不可變的變量。