ES6 ES6標準let和const語句

2021-08-20 10:50:10 字數 3487 閱讀 3198

es6 新增了let命令,用來宣告變數。它的用法類似於var,但是所宣告的變數,只在let命令所在的**塊內有效。

a// referenceerror: a is not defined.

b// 1

上面**在**塊之中,分別用letvar宣告了兩個變數。然後在**塊之外呼叫這兩個變數,結果let宣告的變數報錯,var宣告的變數返回了正確的值。這表明,let宣告的變數只在它所在的**塊有效。

for迴圈的計數器,就很合適使用let命令。

for

(let i =

0; i <

10; i++

)console.

log(i);

// referenceerror: i is not defined

上面**中,計數器i只在for迴圈體內有效,在迴圈體外引用就會報錯。

es6 新增了let命令,用來宣告變數。它的用法類似於var,但是所宣告的變數,只在let命令所在的**塊內有效。

a// referenceerror: a is not defined.

b// 1

上面**在**塊之中,分別用letvar宣告了兩個變數。然後在**塊之外呼叫這兩個變數,結果let宣告的變數報錯,var宣告的變數返回了正確的值。這表明,let宣告的變數只在它所在的**塊有效。

for迴圈的計數器,就很合適使用let命令。

for

(let i =

0; i <

10; i++

)console.

log(i);

// referenceerror: i is not defined

上面**中,計數器i只在for迴圈體內有效,在迴圈體外引用就會報錯。

var命令會發生」變數提公升「現象,即變數可以在宣告之前使用,值為undefined。這種現象多多少少是有些奇怪的,按照一般的邏輯,變數應該在宣告語句之後才可以使用。

為了糾正這種現象,let命令改變了語法行為,它所宣告的變數一定要在宣告後使用,否則報錯。

// var 的情況

console.

log(

foo)

;// 輸出undefined

var foo =2;

// let 的情況

console.

log(

bar)

;// 報錯referenceerror

let bar =

2;

上面**中,變數foovar命令宣告,會發生變數提公升,即指令碼開始執行時,變數foo已經存在了,但是沒有值,所以會輸出undefined。變數barlet命令宣告,不會發生變數提公升。這表示在宣告它之前,變數bar是不存在的,這時如果用到它,就會丟擲乙個錯誤。

const宣告乙個唯讀的常量。一旦宣告,常量的值就不能改變。

const pi =

3.1415

;pi// 3.1415

pi =3;

// typeerror: assignment to constant variable.

上面**表明改變常量的值會報錯。

const宣告的變數不得改變值,這意味著,const一旦宣告變數,就必須立即初始化,不能留到以後賦值。

const foo;

// syntaxerror: missing initializer in const declaration

上面**表示,對於const來說,只宣告不賦值,就會報錯。

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

if

(true

)max// uncaught referenceerror: max is not defined

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

if

(true

)

上面**在常量max宣告之前就呼叫,結果報錯。

const宣告的常量,也與let一樣不可重複宣告。

var message =

"hello!"

;let age =25;

// 以下兩行都會報錯

const message =

"goodbye!"

;const age =

30;

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

const foo =

;// 為 foo 新增乙個屬性,可以成功

foo.prop =

123;

foo.prop// 123

// 將 foo 指向另乙個物件,就會報錯

foo =

;// typeerror: "foo" is read-only

上面**中,常量foo儲存的是乙個位址,這個位址指向乙個物件。不可變的只是這個位址,即不能把foo指向另乙個位址,但物件本身是可變的,所以依然可以為其新增新屬性。

ES6 ES6學習三 變數的解構賦值

es6 允許按照一定模式,從陣列和物件中提取值,對變數進行賦值,這被稱為解構 destructuring 下面介紹的是陣列 物件 字串 數值和布林值 函式引數的解構賦值。1 模式匹配 只要等號兩邊的模式相同,左邊的變數就會被賦予對應的值。以前 let a 1 let b 2 let c 3 es6 ...

python作者 es6 es6之js的類

起源 js 從建立之初就不支援類,也沒有把類繼承作為定義相似物件以及關聯物件的主要方式,這讓不少開發者感到困惑。而從 es1 誕生之前直到es5 時期,很多庫都建立了一些工具,讓 js 顯得貌似能支援類。儘管一些 js 開發者強烈認為這門語言不需要類,但為處理類而建立的 庫如此之多,導致 es6 最...

《ES6標準入門》(一)let和const

一 let命令 1 let的作用域只在 塊內,塊外無效 var全域性有效 var a for var i 0 i 10 i a 6 對於這段 變數i是var宣告的,在全域性範圍內有效,所以每一次迴圈,新的i值都會覆蓋舊值,導致最後輸出的是最後一輪的i值 如果使用let,宣告的變數僅在塊級作用域內有效...