ES6之前變量聲明
作者:米書林
參考文章:《菜鳥教程》、《 ECMAScript 6 入門》(阮一峰)
聲明方式:
var a = 123;
特點(diǎn):
-var變量可以重復(fù)聲明,后面聲明的變量會(huì)覆蓋前面的變量
例如:
var a = 1;
var a = 2;
console.log(a); // 2
-無(wú)法限制變量的修改(沒有常量的概念)
例如:
var PIE = 3.14;
PIE =3;
console.log(PIE); // 3
-沒有塊級(jí)作用域,即大括號(hào)內(nèi)聲明的變量大括號(hào)外也能使用
var str = "1233";
if(str){
var str1 = str;
}
console.log(str1); \\ 1233
-var聲明的變量,先使用再聲明,初始化值為:undefined
例如:
console.log(a1); // undefined
var a1=1;
console.log(a1); // 1
這是因?yàn)樵贘avaScript中帆吻,變量的聲明會(huì)被提升普泡。
我們可以把JavaScript中的變量和函數(shù)定義大概分成三個(gè)過程:
-- 創(chuàng)建
-- 初始化
-- 賦值
再使用var定義變量的時(shí)候創(chuàng)建和初始化被提升了
ES6變量聲明
ES6引入了let和const來(lái)聲明變量
let
let聲明變量的方式
let a = 123;
let聲明變量的特點(diǎn):
-變量不能重復(fù)聲明
例如:
let a = 1;
let a = 2;
console.log(a);
上面代碼瀏覽器會(huì)拋出錯(cuò)誤:
Uncaught SyntaxError: Identifier 'a' has already been declared
但需要注意的是播掷,在for循環(huán)中變量似乎能重復(fù)聲明
例如:
for (let i = 0; i < 10; i++) {
let s = "a";
console.log(s); //這里會(huì)輸出10個(gè)a
}
什么原因呢?
其實(shí)每個(gè)循環(huán)每執(zhí)行一次都有一個(gè)大括號(hào){}撼班,{}內(nèi)的代碼屬于一個(gè)代碼塊叮趴,let聲明的變量屬于塊級(jí)作用域,所以看上去能重復(fù)聲明权烧。
-定義的變量可以被修改
例如:
let c = 1;
c++;
console.log(c); //2
-定義的變量是塊級(jí)作用域的變量
例如:
{
let a = 1;
}
console.log(a);
上面代碼瀏覽器會(huì)報(bào)錯(cuò):
VM146:4 Uncaught ReferenceError: b is not defined at <anonymous>:4:13
- 必須先聲明后使用
例如:
console.log(a);
let a = 12;
上面代碼瀏覽器會(huì)報(bào)錯(cuò):
VM1232:1 Uncaught ReferenceError: Cannot access 'sssa' before initialization at <anonymous>:1:13
這是因?yàn)閘et定義的變量處在一個(gè)自塊頂部到初始化處理的暫時(shí)性死區(qū)
中,我們可以理解為我們?cè)谑褂米兞康臅r(shí)候let定義的變量只完成了創(chuàng)建眯亦,沒有進(jìn)行初始化
const
const聲明變量的方式:
const s = 1;
const 聲明常量的特點(diǎn):
-常量不能重復(fù)聲明,同let
-常量不能被修改
例如:
const p = 1;
p=2;
上面的代碼瀏覽器會(huì)報(bào)錯(cuò):
VM875:1 Uncaught TypeError: Assignment to constant variable. at <anonymous>:1:2
- 必須先聲明后使用
總結(jié):
ES6變量的聲明加入的常量的聲明和變量塊級(jí)作用域的新特性般码。
以下文字是菜鳥教程對(duì)const定義常量原理的描述
const 如何做到變量在聲明初始化之后不允許改變的妻率?其實(shí) const 其實(shí)保證的不是變量的值不變,而是保證變量指向的內(nèi)存地址所保存的數(shù)據(jù)不允許改動(dòng)板祝。此時(shí)宫静,你可能已經(jīng)想到,簡(jiǎn)單類型和復(fù)合類型保存值的方式是不同的券时。是的孤里,對(duì)于簡(jiǎn)單類型(數(shù)值 number、字符串 string 橘洞、布爾值 boolean),值就保存在變量指向的那個(gè)內(nèi)存地址捌袜,因此 const 聲明的簡(jiǎn)單類型變量等同于常量。而復(fù)雜類型(對(duì)象 object炸枣,數(shù)組 array虏等,函數(shù) function),變量指向的內(nèi)存地址其實(shí)是保存了一個(gè)指向?qū)嶋H數(shù)據(jù)的指針适肠,所以 const 只能保證指針是固定的霍衫,至于指針指向的數(shù)據(jù)結(jié)構(gòu)變不變就無(wú)法控制了,所以使用 const 聲明復(fù)雜類型對(duì)象時(shí)要慎重侯养。