ES6シリーズ変数宣言
ES6シリーズ
ES6シリーズ変数の分解の割り当て
変数を宣言させ、constは定数を宣言する
varとletとconstの違いです。
スコープ
letとconstはブロックレベルのスコープで、中かっこ全体で
のみ表示されます。Varにはグローバルスコープと関数スコープしかあり
ません。なぜブロックレベルスコープにする必要があるのですか?
1.内部変数は外部変数をカバーする場合があります。
2.カウントに使用されるループ変数がグローバル変数としてリークされます。
従来の非同期+ varインタビューの質問
for (var i = 0; i < 5; i++) {
setTimeout(function(){
console.log(i) // 5,5,5,5,5
},1000)
}
console.log(i) // 5
for (let i = 0; i < 5; i++) {
setTimeout(function(){
console.log(i) // 0,1,2,3,4
},1000)
}
console.log(i) // undefined
2.変数プロモーション
varには変数プロモーションがあり、デフォルト値undefinedは宣言されていません
let、const未声明会提示ReferenceError
console.log(a) //undefined
var a = 1
console.log(a)//Uncaught ReferenceError: a is not defined
let a = 1
3.
varの繰り返し宣言は
letの繰り返し宣言を許可し、constは同じスコープ内での繰り返し宣言を許可しません
let a
let a//Uncaught SyntaxError: Identifier 'a' has already been declared
4.
グローバルオブジェクト属性のletおよびconstによって宣言されたグローバル変数は、グローバルオブジェクトの属性ではありません
let a = 0
console.log(this.a) //undefiend
一時的なデッドゾーン
ブロックレベルのスコープにletコマンドがある限り、宣言する変数はこのゾーンに「バインド」され、外部の影響を受けなくなります。
var tmp = 123;
if (true) {
tmp = 'abc' //ReferenceError
let tmp
}
変数xはletコマンドを使用して宣言されていますが、宣言の前にtypeofを実行するとReferenceErrorがスロー
されます。変数がまったく宣言されていない場合、typeofを使用してもエラーは報告されません。
constは定数を定義します
//次の内容はRuan Yifeng先生からの引用「ECMAScript 6の紹介」
constが実際に保証するのは、変数の値を変更できないことではなく、変数が指すメモリアドレスに格納されているデータを変更できないことです。単純なタイプのデータ(数値、文字列、ブール値)の場合、値は変数が指すメモリアドレスに格納されるため、定数と同等です。ただし、複合データ(主にオブジェクトと配列)の場合、変数が指すメモリアドレスは、実際のデータへのポインタにすぎません。constは、ポインタが固定されている(つまり、常に別の固定アドレスを指している)ことのみを保証できます。 、それが指すデータ構造が可変であるかどうかに関しては、それは完全に制御不可能です。
オブジェクトを本当にフリーズしたい場合は、Object.freezeメソッドを使用する必要があります。
上記のコードでは、定数fooはフリーズされたオブジェクトを指しているため、新しい属性の追加は機能せず、厳密モードではエラーが報告されます。
オブジェクト自体をフリーズすることに加えて、オブジェクトのプロパティもフリーズする必要があります。以下は、オブジェクトを完全にフリーズする関数です。