前端日記 ES6日記 let 和const命令

2021-09-26 23:55:27 字數 3268 閱讀 6210

es6新增了let命令,用於變數宣告。其用法類似於var。但是所宣告的變數只在**塊中有效。舉例:

console.

log(a)

;//referenceerror: a is not definde.

console.

log(b)

;// 20

補充例子

var會存在變數提公升現象,變數可以在未宣告之前使用,而let為了糾正這個問題,要求必須先宣告再使用,在宣告前使用會報錯,舉例:

// var的情況

console.

log(foo)

;// 輸出undefined

var foo =2;

// let的情況

console.

log(bar)

;// 報錯 referenceerror

let bar =

2;

只要在作用於內存在let命令,他的所有宣告變數及時繫結在這個區域的,不再受外部影響,舉例:

var temp =

123;if(

true

)

報錯原因是在區域內有let宣告了變數,但是使用卻在宣告之前,因此賦值會報錯。在這種情況下typeof也不是完全安全的操作,舉例:

typeof tmp;

// 報錯 referenceerror

let tmp =

123;

typeof undefinedvar;

// undefined

對於乙個沒有宣告的變數,typeof是不會報錯的。

有些隱蔽死區,也是容易出錯的地方,舉例:

function

bar(x = y, y =2)

bar();

// 報錯

函式報錯原因在於x等於變數y,但是y在此時沒有宣告。如果更改一下位置即可,y在使用x的時候,x已經宣告過了,不會報錯同時

function

bar(x =

2, y = x)

bar(

);

let 不允許相同的變數在同乙個作用域內重複說明,舉例:

// 報錯

function

bar(

)// 報錯

function

bar(

)// 報錯

function

bar(arg)

// 不報錯

function

bar(arg)

}

塊級作用域的出現主要解決兩個問題,第乙個是內層變數可能覆蓋外層變數,第二個是,用來計數的迴圈變數洩露為全域性變數。舉例:

// 變數覆蓋

var tmp =

newdate()

;functionf(

)}f(

);// undefined 原因在於 if內的var變數提公升,覆蓋了外邊的tmp,所以列印為undefined

// 計數迴圈變數為全域性變數

s ="hello"

;for

(var i =

0; i < s.length; i++)

console.

log(i)

;// 5 迴圈結束後沒有被銷毀,洩露為全域性變數

functionf(

) console.

log(n)

;// 5

}

es6在塊級作用域中,函式宣告也會存在變數提公升的處理,舉例:

// 下面函式會報錯 uncaught typeerror: f is not a function

functionf(

)(function()

}f()

;})(

);// 原因為

functionf(

)(function()

}f()

;// uncaught typeerror: f is not a function})

();

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

constpi=

3.14;pi

=3;// 報錯

宣告必須初始化,不然報錯,舉例:

constpi;

// 報錯

同樣const在塊級作用域有效,也不存在變數提公升,同樣不能重複定義,舉例:

// 塊級作用域有效if(

true)pi

// 報錯

// 不存在變數提公升if(

true

)// 不可重複定義

var massage =

"hello"

;let age =10;

// 下面兩句報錯

const massage =

"hello"

;const age =

10;

const實際上保證的並不是變數的值不能改動,而是變數指向的那個記憶體位址不能改動,對於簡單的資料型別(如:數值、布林、字串)而言,變數指向的記憶體位址儲存的只是乙個指標,const能夠保證這個指標是固定的,至於它指向的資料結構是不是可變的,這是完全不能控制的,因此,將乙個物件宣告為常量的時候要小心。舉例:

const foo =

// 為foo新增屬性

foo.prop =

123;

// 不報錯

foo.prop;

// 123

const a =

; a.

push

("hello");

// 可執行

a.length;

// 可執行

a =['word'];

// 報錯

如果想將物件凍結,應該使用object.freeze方法。

const foo = object.

freeze()

;// 常規模式下,不起作用,嚴格模式下報錯

foo.prop =

123;

前端ES6學習日記(2) 解構賦值

解構是es6新增的一種變數賦值方式。如以前的 var a 1 var b 2 var c 3 可以用下面解構賦值代替 var a,b,c 1,2,3 該解構允許巢狀,如下 let a,b c 1,2 3 允許有預設值 let c 1,2,3 c 3 let a,b 1,2,3,4 a 1,b 2,3...

智勇 2023年6月 日記

var this month 2006年6月 var diary diary 1 mediaendpoint 開發完成。diary 2 mediaendpoint 開發測試。diary 3 diary 4 週末休息。diary 5 mediaendpoint bug 修復。dispatcher 開發...

CDQZ集訓DAY6 日記

又炸了。早上起來其他競賽生也走了,食堂做飯做的挺潦草,但為什麼四川燒麥的餡是公尺啊?起來看題總覺得都似曾相識。第一題打完40分暴力後想拿莫隊搞到70分,但發現能想到的莫隊維護都是nsqrt n log n的,並不能拿到分,於是先放下打第二題。第二題上來就想錯了。直接打了乙個貪心。後來想了想,為了保分...