1.let
let用來宣告變數。它的用法類似於var,但是所宣告的變數,只在let命令所在的**塊內有效。
用let宣告變數a:
執行結果:
用發var定義變數b:
執行結果:
let的特點:
1)不存在變數提公升。
注:變數提公升即變數可以在宣告之前被使用,值為undefined。
var就會存在變數提公升的現象,而let規定,let的變數一定要在宣告之後使用,否則就會報錯。
例如:
但是上述情況不會報錯,而是會列印出undefined。
因為var存在變數提公升,所以其執行流程實際是這樣的:
因為變數提公升只會提公升變數的宣告,不會提公升賦值,所以才會輸出undefined。
2)暫時性死區:只要塊級作用域內存在let命令,它所宣告的變數就繫結這個區域,不再受外部的影響。如果區塊中存在let和const命令,這個區塊對這些命令宣告的變數,從一開始就形成了封閉作用域。凡是在宣告之前就使用這些變數,就會報錯。
3)不允許重複宣告:let不允許在相同作用域內,重複宣告同乙個變數,否則就會報錯。
2.const
const宣告乙個唯讀的常量。一旦宣告,常量的值就不能改變,如果用const宣告乙個變數並賦值之後,再給這個變數重新賦值,就會報錯。而且,const一旦宣告變數,就必須初始化,不能留到以後再賦值。如果只宣告不賦值就會報錯。
(注:初始化即賦值)
特點:1)同let,只在宣告所在的塊級作用域內有效。
2)const命令宣告的常量不存在提公升。
3)存在暫時性死區
3.const定義的變數是否可以改變呢?
const是用來定義常量的,而且規定定義的時候必須初始化,且定義後不可以修改。
對於基本資料型別來說,如果定義的時候不初始化值的話就會報錯,錯誤內容就是沒有初始化;如果定義並初始化了之後,再對值進行修改,也會報錯。
因為在基本資料型別中,值是存在棧中的,const定義的這個恆定的變數儲存的是值,而const定義後的變數值不可以修改,修改就會報錯。
對於引用資料型別來說:
1)如果使用const定義引用資料型別的話,物件的屬性是可以被修改的,不會報錯。
例如:
const person =
console.
log(person)
person.name =
"mary"
; console.
log(person)
輸出結果:
2)如果使用const定義引用資料型別的話,修改指向的物件就會報錯。例如:讓person指向另乙個物件:
const person =
person =
console.
log(person)
輸出結果:
這是為什麼呢?
是因為在引用資料型別中,物件存在堆中,物件的位址存在棧中,const定義的這個恆定的變數儲存的是其物件的位址,所以修改物件的內容不會報錯,但是如果修改的是物件的位址,則會報錯。
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
console.log b uncaught referenceerror a is not defined 在for迴圈中,迴圈語句部分是乙個作用域,內部又是乙個作用域 for let a 1 a 3 a 在let宣告變數完成前,對變數賦值會出錯es中模仿塊級作用域 function functi...
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 ...