若是沒有歷史包袱,如今作一些項目,不用考慮較低版本的瀏覽器,某軟,如今本身都已經放棄本身的瀏覽器了,推薦使用Edge瀏覽器~javascript
那麼,在前端工程化的趨勢下,vue,react以及衆多其餘框架的大潮中,ES6仍是有它的用武之處的!前端
先從let const 熱下身吧~vue
全部聲明的變量,只在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聲明的變量就被綁定在了聲明處的塊級做用域,只要在聲明以前調用,就會報錯。
如下兩種都會報錯
let a = 10
let a = 5
複製代碼
var a = 10
let a = 5
複製代碼
const 聲明一個只讀的常量,一旦聲明,值就不能被改變了。
const聲明變量也不會提高,也存在暫時性死區。
const 實際上,並非變量的值不能改變,而是變量所指向的內存地址不能改變,由於,簡單數據類型,值就保存在內存地址中,可是引用類型,變量只能保證指針是固定的,至於數據結構是否是可變,徹底不能控制。也就是,你能夠改變這個對象的屬性啊,巴拉巴拉的,可是,不能將這個對象換成別人~