12.28 JavaScript let 和 const的區別,及應用場景分析

ECMAScript 2015(ECMAScript 6)

ES2015(ES6) 新增加了兩個重要的 JavaScript 關鍵字: letconst

let 聲明的變量只在 let 命令所在的代碼塊內有效。

const 聲明一個只讀的常量,一旦聲明,常量的值就不能改變。

在 ES6 之前,JavaScript 只有兩種作用域: 全局變量函數內的局部變量

全局變量

實例

<code>var carName = "Volvo";

// 這裡可以使用 carName 變量
function myFunction() {
// 這裡也可以使用 carName 變量
}/<code>

全局變量在 JavaScript 程序的任何地方都可以訪問。

局部變量

在函數內聲明的變量作用域是局部的(函數內):

實例

<code>// 這裡不能使用 carName 變量

function myFunction() {
var carName = "Volvo";
// 這裡可以使用 carName 變量
}
// 這裡不能使用 carName 變量/<code>

函數內使用 var 聲明的變量只能在函數內容訪問,如果不使用 var 則是全局變量。

JavaScript 塊級作用域(Block Scope)

使用 var 關鍵字聲明的變量不具備塊級作用域的特性,它在 {} 外依然能被訪問到。

<code>{ 
var x = 2;
}
// 這裡可以使用 x 變量/<code>

在 ES6 之前,是沒有塊級作用域的概念的。

ES6 可以使用 let 關鍵字來實現塊級作用域。

let 聲明的變量只在 let 命令所在的代碼塊 {} 內有效,在 {} 之外不能訪問。

<code>{ 
let x = 2;
}
// 這裡不能使用 x 變量/<code>

重新定義變量

使用 var 關鍵字重新聲明變量可能會帶來問題。

在塊中重新聲明變量也會重新聲明塊外的變量:

實例

<code>var x = 10;
// 這裡輸出 x 為 10
{
var x = 2;
// 這裡輸出 x 為 2
}
// 這裡輸出 x 為 2/<code>

let 關鍵字就可以解決這個問題,因為它只在 let 命令所在的代碼塊 {} 內有效。

實例

<code>var x = 10;
// 這裡輸出 x 為 10
{
let x = 2;
// 這裡輸出 x 為 2

}
// 這裡輸出 x 為 10/<code>

瀏覽器支持

Internet Explorer 11 及更早版本的瀏覽器不支持 let 關鍵字。

下表列出了各個瀏覽器支持 let 關鍵字的最低版本號。

JavaScript let 和 const的區別,及應用場景分析

循環作用域

使用 var 關鍵字:

實例

<code>var i = 5;
for (var i = 0; i < 10; i++) {
// 一些代碼...
}
// 這裡輸出 i 為 10/<code>

使用 let 關鍵字:

實例

<code>let i = 5;
for (let i = 0; i < 10; i++) {
// 一些代碼...
}
// 這裡輸出 i 為 5/<code>

在第一個實例中,使用了 var 關鍵字,它聲明的變量是全局的,包括循環體內與循環體外。

在第二個實例中,使用 let 關鍵字, 它聲明的變量作用域只在循環體內,循環體外的變量不受影響。

局部變量

在函數體內使用 varlet 關鍵字聲明的變量有點類似。

它們的作用域都是 局部的:

<code>// 使用 var
function myFunction() {
var carName = "Volvo"; // 局部作用域
}

// 使用 let
function myFunction() {
let carName = "Volvo"; // 局部作用域
}/<code>

全局變量

在函數體外或代碼塊外使用 varlet 關鍵字聲明的變量也有點類似。

它們的作用域都是 全局的:

<code>// 使用 var
var x = 2; // 全局作用域

// 使用 let

let x = 2; // 全局作用域/<code>

HTML 代碼中使用全局變量

在 JavaScript 中, 全局作用域是針對 JavaScript 環境。

在 HTML 中, 全局作用域是針對 window 對象。

使用 var 關鍵字聲明的全局作用域變量屬於 window 對象:

實例

<code>var carName = "Volvo";
// 可以使用 window.carName 訪問變量/<code>

使用 let 關鍵字聲明的全局作用域變量不屬於 window 對象:

實例

<code>let carName = "Volvo";
// 不能使用 window.carName 訪問變量/<code>

重置變量

使用 var 關鍵字聲明的變量在任何地方都可以修改:

實例

<code>var x = 2;

// x 為 2

var x = 3;

// 現在 x 為 3/<code>

在相同的作用域或塊級作用域中,不能使用 let 關鍵字來重置 var 關鍵字聲明的變量:

<code>var x = 2;       // 合法
let x = 3; // 不合法

{
var x = 4; // 合法
let x = 5 // 不合法
}/<code>

在相同的作用域或塊級作用域中,不能使用 let 關鍵字來重置 let 關鍵字聲明的變量:

<code>let x = 2;       // 合法
let x = 3; // 不合法

{
let x = 4; // 合法
let x = 5; // 不合法
}/<code>

在相同的作用域或塊級作用域中,不能使用 var 關鍵字來重置 let 關鍵字聲明的變量:

<code>let x = 2;       // 合法
var x = 3; // 不合法

{
let x = 4; // 合法
var x = 5; // 不合法
}/<code>

let 關鍵字在不同作用域,或不同塊級作用域中是可以重新聲明賦值的:

<code>let x = 2;       // 合法

{
let x = 3; // 合法
}

{
let x = 4; // 合法
}/<code>

變量提升

JavaScript 中,var 關鍵字定義的變量可以在使用後聲明,也就是變量可以先使用再聲明

實例

<code>// 在這裡可以使用 carName 變量 


var carName;/<code>

let 關鍵字定義的變量則不可以在使用後聲明,也就是變量需要先聲明再使用。

<code>// 在這裡不可以使用 carName 變量

let carName;/<code>

const 關鍵字

const 用於聲明一個或多個常量,聲明時必須進行初始化,且初始化後值不可再修改:

實例

<code>const PI = 3.141592653589793;
PI = 3.14; // 報錯
PI = PI + 10; // 報錯/<code>

const定義常量與使用let 定義的變量相似:

  • 二者都是塊級作用域
  • 都不能和它所在作用域內的其他變量或函數擁有相同的名稱

兩者還有以下兩點區別:

  • const聲明的常量必須初始化,而let聲明的變量不用
  • const 定義常量的值不能通過再賦值修改,也不能再次聲明。而 let 定義的變量值可以修改。
<code>var x = 10;
// 這裡輸出 x 為 10
{
const x = 2;
// 這裡輸出 x 為 2
}
// 這裡輸出 x 為 10/<code>
<code>// 錯誤寫法
const PI;
PI = 3.14159265359;

// 正確寫法
const PI = 3.14159265359;/<code>

並非真正的常量

const 的本質: const 定義的變量並非常量,並非不可變,它定義了一個常量引用一個值。使用 const 定義的對象或者數組,其實是可變的。下面的代碼並不會報錯:

實例

<code>// 創建常量對象
const car = {type:"Fiat", model:"500", color:"white"};

// 修改屬性:
car.color = "red";

// 添加屬性

car.owner = "Johnson";/<code>

但是我們不能對常量對象重新賦值:

實例

<code>const car = {type:"Fiat", model:"500", color:"white"};
car = {type:"Volvo", model:"EX60", color:"red"}; // 錯誤/<code>

以下實例修改常量數組:

實例

<code>// 創建常量數組
const cars = ["Saab", "Volvo", "BMW"];

// 修改元素
cars[0] = "Toyota";

// 添加元素
cars.push("Audi");/<code>

但是我們不能對常量數組重新賦值:

實例

<code>const cars = ["Saab", "Volvo", "BMW"];
cars = ["Toyota", "Volvo", "Audi"]; // 錯誤/<code>

瀏覽器支持

Internet Explorer 10 及更早版本的瀏覽器不支持 const 關鍵字。

下表列出了各個瀏覽器支持 const 關鍵字的最低版本號。

JavaScript let 和 const的區別,及應用場景分析

重置變量

使用 var 關鍵字聲明的變量在任何地方都可以修改:

實例

<code>var x = 2;    //  合法
var x = 3; // 合法
x = 4; // 合法/<code>

在相同的作用域或塊級作用域中,不能使用 const 關鍵字來重置 varlet關鍵字聲明的變量:

<code>var x = 2;         // 合法
const x = 2; // 不合法
{
let x = 2; // 合法
const x = 2; // 不合法
}/<code>

在相同的作用域或塊級作用域中,不能使用 const 關鍵字來重置 const 關鍵字聲明的變量:

<code>const x = 2;       // 合法
const x = 3; // 不合法
x = 3; // 不合法
var x = 3; // 不合法
let x = 3; // 不合法

{
const x = 2; // 合法
const x = 3; // 不合法
x = 3; // 不合法
var x = 3; // 不合法
let x = 3; // 不合法
}/<code>

const 關鍵字在不同作用域,或不同塊級作用域中是可以重新聲明賦值的:

<code>const x = 2;       // 合法

{
const x = 3; // 合法
}

{
const x = 4; // 合法
}/<code>

變量提升

JavaScript var 關鍵字定義的變量可以在使用後聲明,也就是變量可以先使用再聲明

實例

<code>carName = "Volvo";    // 這裡可以使用 carName 變量
var carName;/<code>

const 關鍵字定義的變量則不可以在使用後聲明,也就是變量需要先聲明再使用。

<code>carName = "Volvo";    // 在這裡不可以使用 carName 變量
const carName = "Volvo";/<code>


專注於技術熱點大數據,人工智能,JAVA、Python、 C 、GO、Javascript等語言最新前言技術,及業務痛點問題分析,請關注【編程我最懂】共同交流學習。


分享到:


相關文章: