es6 新增了let
命令,用來宣告變數。它的用法類似於var
,但是所宣告的變數,只在let
命令所在的**塊內有效。
a// referenceerror: a is not defined.
b// 1
上面**在**塊之中,分別用let
和var
宣告了兩個變數。然後在**塊之外呼叫這兩個變數,結果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
上面**在**塊之中,分別用let
和var
宣告了兩個變數。然後在**塊之外呼叫這兩個變數,結果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;
上面**中,變數foo
用var
命令宣告,會發生變數提公升,即指令碼開始執行時,變數foo
已經存在了,但是沒有值,所以會輸出undefined
。變數bar
用let
命令宣告,不會發生變數提公升。這表示在宣告它之前,變數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,宣告的變數僅在塊級作用域內有效...