ES6中let和const命令

2021-09-29 17:56:56 字數 3339 閱讀 2824

es6中新增了 let 命令,用於宣告變數,關於let有以下幾個特點:

1 用法類似於var,但是所宣告的變數只在 let 命令所在的**塊內有效,實現了塊級作用域且不會汙染全域性變數。

2 不存在變數提公升

3 暫時性死區

4 同乙個變數在相同作用域內不允許重複宣告

下面圍繞這四個特點進行詳細的分析

let 的基本用法

let宣告的變數與var不用的是,let宣告的變數只在相應的**塊內有效。看下面例子:

console.

log(a)

;//referenceerror: a is not defined

console.

log(b)

;//5

然後再看一下let的應用場景與var的不同之處:

var nums =

;for

(var i=

0; i <

10; i++)}

nums[3]

()//10

for(

let i=

0; i <

10; i++)}

nums[3]

()//3

上面例子中,第乙個輸出是10,第二個輸出是3,那麼為什麼是這樣呢?因為第乙個for迴圈變數i是用var定義的,var定義的在全域性範圍有效,所以全域性只有乙個i,每次迴圈i的值都會改變,所以在被賦值給陣列內部函式的i指向全域性,就是說所有陣列中的i都是指向全域性的同乙個i,即最後一次迴圈的結果10

而第二次,用let宣告的變數i,每次迴圈i都是乙個新的變數,所以最後輸出就是對應的i的值。

不存在變數提公升

既然說let不存在變數提公升,那麼什麼是變數提公升呢?變數提公升可以理解為變數還沒有宣告就已經使用了,即變數在宣告之前使用。

我們都知道var命令會發生變數提公升,而let命令不會發生變數提公升,就是在使用乙個變數之前必須先對該變數進行宣告,不然不會報錯,而var命令的話,如果變數在宣告之前使用的話不會報錯,會顯示undefined。看下面例子:

console.

log(a)

;var a =

'你好'

;//undefined

console.

log(b)

;let b =

'你好'

;// referenceerror

暫時性死區

那麼什麼是暫時性死區呢?在**塊內,只要有let和const命令,則這個塊內用這些命令宣告的的變數就繫結在這個塊級作用域中,不受外部的影響,在**塊內使用let宣告之前變數都是不可用的,這就是暫時性死區。

看下面例子:

var s =

'nihao';if

(true

)

上面例子中,看到第三行報錯了,就是因為在if**塊內變數s還沒有用let宣告就已經使用了,會報錯,此時變數s屬於暫時性死區。

不允許重複宣告

let不允許在相同作用域內重複宣告同乙個變數。否則就會報錯。

看下面幾個例子都會報錯。

function

tist()

//syntaxerror: identifier 'a' has already been declared

function

tist()

//syntaxerror: identifier 'a' has already been declared

function

tist

(msg)

//syntaxerror: identifier 'msg' has already been declared

const 宣告乙個唯讀的常量。一旦宣告,常量的值就不能改變。而且使用const宣告乙個常量的使用,必須在宣告時就初始化,就是在用const宣告時就要給予賦值,否則就會報錯。看下面例子:

const s =1;

s =2;

//typeerror: assignment to constant variable

const a;

//syntaxerror: missing initializer in const declaration

a =5;

const 的作用域與 let 命令相同:只在宣告所在的塊級作用域內有效

const 命令宣告的常量也不會提公升,同樣存在暫時性死區,只能在宣告後使用。

**例子可參看上面let命令時的例子。

const命令的注意事項

在阮一峰的es6標準入門中這樣說到:const 實際上保證的並不是變數的值不得改動,而是變數指向的那個記憶體位址不得改動。對於簡單型別的資料(數值、字串、布林值〉而言,值就儲存在變數指向的記憶體位址中,因此等同於常量。但對於復合型別的資料(主要是物件和陣列)而言,變數指向的記憶體位址儲存的只是乙個指標, const 只能保證這個指標是固定的,至於它指向的資料結構是不是可變的,這完全不能控制 因此,將乙個物件宣告為常量時必須非常小心。

const s =

; s.a =1;

console.

log(s)

// s =

//typeerror: assignment to constant variable

const s =

; s.

push(1

);s.

push(2

);console.

log(s)

;//[1, 2]

s =[3

];//typeerror: assignment to constant variable

因此我們使用const宣告簡單的資料型別時(數值、字串、布林值〉值就是儲存在變數指向的記憶體位址,但是用const宣告複雜的資料型別時,比如物件和陣列,變數指向的記憶體位址儲存的只是乙個指標,我們只要保證這個指標不被改動就行了。

物件凍結(object.freeze())新增新屬性不起作用,嚴格模式時還會報錯。

徹底凍結物件的函式:

var

constantize

=(obj)

=>})

;};

ES6學習 let和const命令

1.let命令 所宣告的變數命令所在 塊有效 a referenceerror a is not defined.b 1for迴圈的計數器,就很適合let命令 for let i 0 i arr.length i console.log i referenceerror i is not defin...

ES6 一 let和const命令

在js中是沒有塊級作用域的,var 宣告的變數作用域是整個函式體,而let可以起到這一作用 console.log b 2 console.log a a is not defind 而let可以起到這一作用啊在js中變數和函式的宣告會提公升到當前作用域最頂部執行。這樣就會出現問題。var a 函式...

ES6學習 let和const命令

說明 本文參考阮一峰的ecmascript 6 入門 console.log a 塊外使用會報錯 referenceerror a is not defined for迴圈內使用let和var產生的不同效果 下面 使用的是var,結果為10 var a for var i 0 i 10 i a 9 ...