|
|
|
|
|
JavaScript有三種聲明方式:var
,let
,const
,在本文中,將介紹如何使用這三種聲明方式,以及它們之間的區(qū)別。
聲明
聲明一個變量,可選初始化一個值。
聲明一個塊作用域的局部變量,可選初始化一個值。
聲明一個塊作用域的只讀常量。
聲明變量
你可以用以下三種方式聲明變量:
var
。例如 var x = 42
。這個語法可以用來聲明局部變量和全局變量。x = 42
。在函數(shù)外使用這種形式賦值,會產(chǎn)生一個全局變量。在嚴(yán)格模式下會產(chǎn)生錯誤。因此你不應(yīng)該使用這種方式來聲明變量。let
。例如 let y = 13
。這個語法可以用來聲明塊作用域的局部變量。參考下面變量的作用域。用 var
或 let
語句聲明的變量,如果沒有賦初始值,則其值為 undefined
。
注意:像x = 42
這種聲明方式將會創(chuàng)建一個未聲明全局變量,這樣做還會產(chǎn)生JavaScript警告,因為未聲明的全局變量常常導(dǎo)致預(yù)期之外的行為,所以不建議使用。
如果訪問一個未聲明的變量會導(dǎo)致拋出一個引用錯誤(ReferenceError)異常:
var a;
console.log("The value of a is " + a); // a 的值是 undefined
console.log("The value of b is " + b);// b 的值是 undefined
var b;
console.log("The value of c is " + c); // 未捕獲的引用錯誤: c 未被定義
let x;
console.log("The value of x is " + x); // x 的值是 undefined
console.log("The value of y is " + y);// 未捕獲的引用錯誤: y 未被定義
let y;
你可以使用 undefined
來判斷一個變量是否已賦值。在以下的代碼中,變量input
未被賦值,因此 if
條件語句的求值結(jié)果是 true
。
var input;
if(input === undefined){
doThis();
} else {
doThat();
}
undefined
值在布爾類型環(huán)境中會被當(dāng)作 false
。例如,下面的代碼將會執(zhí)行函數(shù) myFunction
,因為數(shù)組 myArray
中的元素未被賦值:
var myArray = [];
if (!myArray[0]) myFunction();
數(shù)值類型環(huán)境中 undefined
值會被轉(zhuǎn)換為 NaN
。
var a;
a + 2; // 計算為 NaN
當(dāng)你對一個 null
變量求值時,空值 null
在數(shù)值類型環(huán)境中會被當(dāng)作0來對待,而布爾類型環(huán)境中會被當(dāng)作 false
。例如:
var n = null;
console.log(n * 32); // 在控制臺中會顯示 0
變量的作用域
在函數(shù)之外聲明的變量,叫做全局變量,因為它可被當(dāng)前文檔中的任何其他代碼所訪問。在函數(shù)內(nèi)部聲明的變量,叫做局部變量,因為它只能在當(dāng)前函數(shù)的內(nèi)部訪問。
ECMAScript 6 之前的 JavaScript 沒有語句塊作用域;相反,語句塊中聲明的變量將成為語句塊所在函數(shù)(或全局作用域)的局部變量。例如,如下的代碼將在控制臺輸出 5,因為 x
的作用域是聲明了 x
的那個函數(shù)(或全局范圍),而不是 if
語句塊。
if (true) {
var x = 5;
}
console.log(x); // 5
如果使用 ECMAScript 6 中的 let
聲明,上述行為將發(fā)生變化。
if (true) {
let y = 5;
}
console.log(y); // ReferenceError: y 沒有被聲明
常量(Constants)
你可以用關(guān)鍵字 const
創(chuàng)建一個只讀的常量。常量標(biāo)識符的命名規(guī)則和變量相同:必須以字母、下劃線(_)或美元符號($)開頭并可以包含有字母、數(shù)字或下劃線。
const PI = 3.14;
常量不可以通過重新賦值改變其值,也不可以在代碼運(yùn)行時重新聲明。它必須被初始化為某個值。
常量的作用域規(guī)則與 let
塊級作用域變量相同。若省略const
關(guān)鍵字,則該標(biāo)識符將被視為變量。
在同一作用域中,不能使用與變量名或函數(shù)名相同的名字來命名常量。例如:
// 這會造成錯誤
function f() {};
const f = 5;
// 這也會造成錯誤
function f() {
const g = 5;
var g;
//語句
}
然而,對象屬性被賦值為常量是不受保護(hù)的,所以下面的語句執(zhí)行時不會產(chǎn)生錯誤。
const MY_OBJECT = {"key": "value"};
MY_OBJECT.key = "otherValue";
同樣的,數(shù)組的被定義為常量也是不受保護(hù)的,所以下面的語句執(zhí)行時也不會產(chǎn)生錯誤。
const MY_ARRAY = ['HTML','CSS'];
MY_ARRAY.push('JAVASCRIPT');
console.log(MY_ARRAY); //logs ['HTML','CSS','JAVASCRIPT'];
總結(jié)
本文詳細(xì)介紹了JavaScrip的三種聲明方式,它們在使用上是有不同的。通過本文,你應(yīng)該了解了JavaScript三種聲明方式:var
,let
,const
它們之間的使用區(qū)別,在實際應(yīng)用中不要混淆,以免出錯。
相關(guān)文章