var let const 的比較

使用

在 es6 出現(xiàn)之前月杉, 我們通常使用 var 來申明一個(gè)變量:
var x = 'test'
es6 中新增加了 letconst , 他們的作用和 var 相同苛萎,用于申明一個(gè)變量:
let x = 'test'
const Pi = 3.1415926

對(duì)比

約束: const 检号、let 蛙酪、var 約束依次變得松散:

var 對(duì)比 letconst :

//正常運(yùn)行
var name = 'js'
var name = 'py'
name       // py

//錯(cuò)誤
let name = 'js'
let name = 'py'  //Uncaught SyntaxError: Identifier 'name' has already been declared

const name = 'js'
const name = 'py' //Uncaught SyntaxError: Identifier 'name' has already been declared
結(jié)論1: var 申明的變量可以用 var 進(jìn)行重新申明, 而 letconst 則不行
//可以對(duì)變量重新賦值
let name = 'js'
name = 'py'
name // py

//無法對(duì)變量重新賦值
const name = 'js'
name = 'py'   //Uncaught TypeError: Assignment to constant variable

// 必須在申明變量的時(shí)候就給定一個(gè)值
const a  //Missing initializer in const declaration
結(jié)論2: const 必須在申明的時(shí)候就給變量初始化一個(gè)值桂塞,且該變量的值不能改動(dòng)

原因:const 實(shí)際上保證的,并不是變量的值不得改動(dòng)玛痊,而是變量指向的那個(gè)內(nèi)存地址不得改動(dòng)。對(duì)于簡單類型的數(shù)據(jù)(數(shù)值擂煞、字符串趴乡、布爾值)对省,值就保存在變量指向的那個(gè)內(nèi)存地址晾捏,因此等同于常量。但對(duì)于復(fù)合類型的數(shù)據(jù)(主要是對(duì)象和數(shù)組)粟瞬,變量指向的內(nèi)存地址萤捆,保存的只是一個(gè)指針,const只能保證這個(gè)指針是固定的俗或,至于它指向的數(shù)據(jù)結(jié)構(gòu)是不是可變的,就完全不能控制了

變量提升:

var 命令會(huì)發(fā)生”變量提升“現(xiàn)象区匠,var 申明變量會(huì) 其申明語句會(huì)自動(dòng)提升到 當(dāng)前執(zhí)行環(huán)境最前面:

console.log(x) // undefined
var x = 0
console.log(x) // 0

//上面的的語句相當(dāng)于下面語句
var x
console.log(x) // undefined
x = 0
console.log(x) // 0

//let const 不會(huì)出現(xiàn)這種情況
console.log(y) // Uncaught ReferenceError: y is not defined
let y = 0

console.log(z) // Uncaught ReferenceError: z is not defined
const z = 0
結(jié)論3:var 存在變量提升現(xiàn)象帅腌, 而 const let 不存在

塊級(jí)作用域:

在 es6之前,ES5 只有全局作用域和函數(shù)作用域速客,沒有塊級(jí)作用域, 而let提供了塊級(jí)作用域:

var test1 = function() {
  var x = 2
  if(1){
    var x = 3
  }
  console.log(x) 
}
test1()  //3

let test2 = function() {
  let x = 2
  if(1){
    let x = 3
  }
  console.log(x) // 2
}
test2()  //2
結(jié)論4:let 會(huì)使得代碼塊擁有自己的作用域溺职, 其內(nèi)部的變量申明不會(huì)干擾外部

關(guān)于塊級(jí)作用域位喂,有一個(gè)常見的面試題:

//(1)再循環(huán)中 延時(shí)輸出數(shù)字
for (var i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i)  //會(huì)輸出5個(gè) 5
  }, 1000)
}


// (2)如果想要輸出0, 1, 2乱灵,3, 4 可以這樣寫:
for (var i = 0; i < 5; i++) {
  (function f1(k) {
    setTimeout(function(k) {
      console.log( k)
    }, 1000)
  })(i)
}



//(3)上面的方法是借用閉包形成一個(gè)新的作用域,我們已經(jīng)知道 _let_ 可以形成塊級(jí)作用域痛倚,所以我們可以使用_let_達(dá)到同樣的目的:
for (let i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i)
  }, 1000)
}
理解:
  1. 變量 i 由 var申明, 則循環(huán)每一次都是引用的同一個(gè)i蝉稳, 所以 i 會(huì)變成 5 輸出 5個(gè) 5
  1. 這里每一次 的 i 被我們傳進(jìn) 一個(gè)立即執(zhí)行函數(shù), 立即執(zhí)行函數(shù)內(nèi)部有新的作用域削锰, 每一次的k都是新的值毕莱, 而每一次的k 存儲(chǔ)了 每一次的 i, 所以輸出 0,1,2,3,4
  1. 變量i是let聲明的器贩,當(dāng)前的i只在本輪循環(huán)有效朋截,所以每一次循環(huán)的i其實(shí)都是一個(gè)新的變量,其中有一點(diǎn)是部服, javaScript 引擎內(nèi)部會(huì)記住上一輪循環(huán)的值,初始化本輪的變量i時(shí)奉芦,就在上一輪循環(huán)的基礎(chǔ)上進(jìn)行計(jì)算。

對(duì)比總結(jié)

  • var 申明的變量可以用 var 進(jìn)行重新申明声功, 而 letconst 則不行
  • 結(jié)論2: const 必須在申明的時(shí)候就給變量初始化一個(gè)值宠叼,且該變量的值不能改動(dòng)
  • let 存在變量提升現(xiàn)象先巴, 而 const let 不存在
  • let 會(huì)使得代碼塊擁有自己的作用域冒冬, 其內(nèi)部的變量申明不會(huì)干擾外部

應(yīng)用場景:

  • let 可以代替 var 的使用, 可以避免變量的意外重命名沖突
  • const 適用于你一次定義简烤,不希望別人再進(jìn)行改動(dòng)的場景,比如config里面的 常值變量抗斤、工具函數(shù) 等等
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瑞眼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伤疙,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黍特,死亡現(xiàn)場離奇詭異锯蛀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)翔曲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門劈愚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人菌羽,你說我怎么就攤上這事∽⒆妫” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵婚夫,是天一觀的道長浸卦。 經(jīng)常有香客問我,道長靴庆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任炉抒,我火速辦了婚禮稚叹,結(jié)果婚禮上拿诸,老公的妹妹穿的比我還像新娘。我一直安慰自己亩码,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布描沟。 她就那樣靜靜地躺著鞭光,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惰许。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天娜睛,我揣著相機(jī)與錄音,去河邊找鬼畦戒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛障斋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播垃环,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼返敬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了劲赠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤霹肝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后沫换,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡讯赏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了甥角。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嗤无,死狀恐怖怜庸,靈堂內(nèi)的尸體忽然破棺而出当犯,到底是詐尸還是另有隱情割疾,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布宏榕,位于F島的核電站,受9級(jí)特大地震影響麻昼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜倍谜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一叉抡、第九天 我趴在偏房一處隱蔽的房頂上張望尔崔。 院中可真熱鬧褥民,春花似錦、人聲如沸消返。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至秦驯,卻和暖如春挣棕,著一層夾襖步出監(jiān)牢的瞬間亲桥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工题篷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厅目,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓损敷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拗馒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容