如果沒有歷史包袱,現在做一些專案,不用考慮較低版本的瀏覽器,某軟,現在自己都已經放棄自己的瀏覽器了,推薦使用Edge瀏覽器~
那麼,在前端工程化的趨勢下,vue,react以及眾多其他框架的大潮中,ES6還是有它的用武之處的!
先從let const 熱下身吧~
let
所有宣告的變數,只在let命令所在的程式碼塊內有效。
for迴圈計數器就很適合使用let,如果用 var 來宣告 for迴圈內的變數,有可能會導致外部某處的同名變數受到影響。
還有一個很經典的輸出問題
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 設定迴圈的部分是父作用域,迴圈體內是子作用域
看demo
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 實際上,並不是變數的值不能改變,而是變數所指向的記憶體地址不能改變,因為,簡單資料型別,值就儲存在記憶體地址中,但是引用型別,變數只能保證指標是固定的,至於資料結構是不是可變,完全不能控制。也就是,你可以改變這個物件的屬性啊,巴拉巴拉的,但是,不能將這個物件換成別人~