ES6 變數 常量宣告總結

2022-03-04 04:13:35 字數 1901 閱讀 8201

較之前es5,新版本在宣告上有改變,現根據文件教程,總結下不同之處,時長溫習。

let只在命令所在的**塊 {} 裡有效

es5只有全域性作用域和函式作用域,沒有塊級作用域,帶來很多不合理的場景,比如:

第一種場景,內層變數可能會覆蓋外層變數。

var tmp = new

date();

function

f()

}f();

//undefined

上面**的原意是,if**塊的外部使用外層的tmp變數,內部使用內層的tmp變數。但是,函式f執行後,輸出結果為undefined,原因在於變數提公升,導致內層的tmp變數覆蓋了外層的tmp變數。

第二種場景,用來計數的迴圈變數洩露為全域性變數。

var s = 'hello';

for (var i = 0; i < s.length; i++)

console.log(i);

//5

上面**中,變數i只用來控制迴圈,但是迴圈結束後,它並沒有消失,洩露成了全域性變數。

es6的塊級作用域可以多個巢狀,外層作用域無法訪問內層作用域,內層作用域可以宣告外層作用域的引數。

另外,es6標準也執行在塊級作用域下宣告函式,而作用域外不可以引用,函式宣告是類似於var還是let,歌瀏覽器可能有自己的處理方式,

所以暫時不建議在塊級作用域下宣告函式

塊級作用域是乙個語句,裡面封裝了若干語句,沒有返回值,現在有乙個提案,使得塊級作用域可以變為表示式,也就是說可以返回值,

辦法就是在塊級作用域之前加上do,使它變為do表示式。

es6明確規定,如果區塊中存在letconst命令,這個區塊對這些命令宣告的變數,從一開始就形成了封閉作用域。凡是在宣告之前就使用這些變數,就會報錯。

總之,在**塊內,使用let命令宣告變數之前,該變數都是不可用的。這在語法上,稱為「暫時性死區」(temporal dead zone,簡稱 tdz)。

es6 規定暫時性死區和letconst語句不出現變數提公升,主要是為了減少執行時錯誤,防止在變數宣告前就使用這個變數,從而導致意料之外的行為。這樣的錯誤在 es5 是很常見的,現在有了這種規定,避免此類錯誤就很容易了。

總之,暫時性死區的本質就是,只要一進入當前作用域,所要使用的變數就已經存在了,但是不可獲取,只有等到宣告變數的那一行**出現,才可以獲取和使用該變數。

注意:不能在函式裡重複宣告引數,會報錯

es5沒有常量的概念,es6新增常量

const 命令宣告乙個唯讀的常量,一旦宣告,值不可以改變,改變會報錯;只宣告不賦值也會報錯。

作用域與let 相同,只在所在塊級作用域內有效,其他的特性也相同

本質上,const 實際上保證的並不是變數的值不可以改動,而是變數指向的那個記憶體位址不可以改動,

對於簡單型別的資料(數值、字串、布林值),值就儲存在變數指向的那個記憶體位址,因此等同於常量。

但對於復合型別的資料(主要是物件和陣列),變數指向的記憶體位址,儲存的只是乙個指標,const只能保證這個指標是固定的,至於它指向的資料結構是不是可變的,就完全不能控制了。因此,將乙個物件宣告為常量必須非常小心。  

(es5只有 var 和function 函式宣告兩種方式)

inport、class 方式的宣告留坑,待填。

以上內容參照阮一峰老師的《ecmascript 6 入門》,會不定期更新;

es6的常量的宣告

在 es6 中里也可以使用 const 語法進行宣告。使用 const 宣告的變數會被認為是常量 constant 意味著它們的值在被設定完成後就不能再被改變。正因為如此,所有的 const 變數都需要在宣告時進行初始化,示例如下 有效的常量 const maxitems 30 語法錯誤 未進行初始...

ES6常量宣告方式 const

今天就來聊聊es6常量的宣告方式。在es5中定義乙個常量 object.defineproperty window,pi console.log pi 5console.log pi 在es6中定義乙個常量 典型報錯 const a 5a 6 報錯,常量不可以改變 const b 報錯,常量必須賦初...

Es6之變數宣告

es6變數宣告let 和 canst,let 所宣告的變數具有塊級作用域,且宣告的變數不會前置,而const宣告的是不變了常量 let test test let 所宣告的變數只在塊級作用域內有效,而var就不同 for var i 1 i 5 i console.log str 輸出hello.c...