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的,並不能拿到分,於是先放下打第二題。第二題上來就想錯了。直接打了乙個貪心。後來想了想,為了保分...