重學ES6 let & const

若是沒有歷史包袱,如今作一些項目,不用考慮較低版本的瀏覽器,某軟,如今本身都已經放棄本身的瀏覽器了,推薦使用Edge瀏覽器~javascript

那麼,在前端工程化的趨勢下,vue,react以及衆多其餘框架的大潮中,ES6仍是有它的用武之處的!前端

先從let const 熱下身吧~vue

let

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

for循環計數器就很適合使用let,若是用 var 來聲明 for循環內的變量,有可能會致使外部某處的同名變量受到影響。react

還有一個很經典的輸出問題前端工程化

var a = []
for(var i = 0;i < 10; i++){
    console.log(i)
    a[i] = function() {
        console.log(i)
    }
}
a[5]() //10
a[8]() //10
複製代碼

由於i都指向同一個全局i,致使輸出的是最後一輪的i值,也就是 10瀏覽器

可是若是用 let ,那就徹底不同了數據結構

var a = []
for(let i = 0;i < 10; i++){
    console.log(i)
    a[i] = function() {
        console.log(i)
    }
}
a[5]() //5
a[8]() //8
複製代碼

由於,let聲明的變量只在本輪循環有效,每一次循環都是一個新的變量~並且,for 設置循環的部分是父做用域,循環體內是子做用域框架

看demoui

for(let i = 0;i < 3; i++){
    let i = 'hahaha'
    console.log(i)
}
//hahaha
//hahaha
//hahaha
複製代碼

木有變量提高

以前咱們用ES5,var聲明一個變量,可能有時候會這樣寫

console.log( a ) // undefined,可是並不會報錯
var a = 8
複製代碼

之因此能夠這樣寫,是由於 var 存在 「變量提高」

至關於以下代碼

var a 
console.log( a ) // 此時a還未被賦值
var a = 8
複製代碼

可是let 沒有 變量提高

console.log( a ) // RenerenceError
let a = 8
複製代碼

let const 暫時性死區

用let聲明的變量就被綁定在了聲明處的塊級做用域,只要在聲明以前調用,就會報錯。

不容許重複聲明

如下兩種都會報錯

let a = 10 
let a = 5
複製代碼
var a = 10 
let a = 5
複製代碼

const

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

const聲明變量也不會提高,也存在暫時性死區。

本質

const 實際上,並非變量的值不能改變,而是變量所指向的內存地址不能改變,由於,簡單數據類型,值就保存在內存地址中,可是引用類型,變量只能保證指針是固定的,至於數據結構是否是可變,徹底不能控制。也就是,你能夠改變這個對象的屬性啊,巴拉巴拉的,可是,不能將這個對象換成別人~

相關文章
相關標籤/搜索