var、let、constの異同点を深く分析する。


一、letとvarの違い
1.変数の昇格については、var変数の昇格、letはできません。

 //   var     
console.log(a); //  undefined,        
var a = 2;  
console.log(a); //2

//        
var a; //       undefined
console.log(a); //  undefined
a=2;    //  
console.log(a); //2

//   let     
console.log(a); //   ReferenceError
let a = 2;
//          a      ,         

//   let           undefined,       
let a;
console.log(a);//  undefined
2.一時的なデッドゾーン:ブロックレベルのスコープ内にletコマンドがあり、その宣言された変数は「バインディング」という領域について、外部の影響を受けないように重点内容である。つまり、あるコードブロックにはletコマンドがあり、外部に名称が同じ変数があっても、そのコードブロックの同じ変数は外部の変数と干渉しない。varはできません。以下の通りです。

//let
var a = 123;
if (true) {
 let a="abc";
 console.log(a); //  abc 
}
console.log(a);  //    123,  a   a    

//var
var a = 123;
if (true) {
 var a="abc";
 console.log(a); //  abc 
}
console.log(a);  //    abc,       
つまり、コードブロック内では、letコマンドを使用して変数を宣言する前に、この変数は使用できません。これは文法的には「一時的なデッドゾーン」と呼ばれています。例は以下の通りです

var tmp=1;
if (true) {
 // TDZ  
 tmp = 'abc'; // ReferenceError
 console.log(tmp); // ReferenceError

 let tmp; // TDZ  
 console.log(tmp); // undefined

 tmp = 123;
 console.log(tmp); // 123
}
console.log(tmp); // 
3.let宣言バインディングコードブロック内で、同じ変数を繰り返し宣言できません。

//a      
function sub() {
 let a = 10;
 var a = 1;
}  //  ,Identifier 'a' has already been declared

function sub() {
 let a = 10;
 let a = 1;
}  //  

function sub() {
 let a = 10;
 {let a = 1;} //          ,    
} 

//var      ,    
function sub() {
 var a = 10;
 var a = 1;
}
4.forループのコードブロックのように、letはコードブロック内部でのみ有効であり、varはコードブロックの外部でも有効である。

//let         
for (let i = 0; i < 10; i++) {}
console.log(i); //  ReferenceError: i is not defined

//var         
for (let i = 0; i < 10; i++) {}
console.log(i); //101

let for       :                   ,                。
//      
var a = [];
for (let i = 0; i < 10; i++) {
 a[i] = function () {
  console.log(i);
 };
}
a[6](); // 6

//        
var a = [];
for (let i = 0; i < 10; i++) {
 a[i] = function () {
   let i=3; //    
   console.log(i);
 };
}
a[6](); // 3 ,     
二、letとconst
1、同じ点:
A、変数はアップしません。
B、一時的なデッドゾーンは声明の位置の後でしか使えません。
C、繰り返し声明してはいけません。
2、異なる点:
let宣言の変数は変更できます。
constは読み取り専用の定数を宣言します。一旦宣言された時点で、定数の値は変更されず、宣言された場合は初期化されなければならない。
let a;  //undefined
const b;//エラーを報告するときは、声明に値を付けなければなりません。
let a=1
a=2;    //変更可能
const b=1
b=2;    //エラーを出しました。値を変えられません。
//自分が気になるポイント
let a=null         //a=null
a=undefined    //a=undefined
a=2;            //a=2
const a=null   //a=null、constはnullとundefinedを定義することもできます。
const b=undefined   //b=undefined
b=2;            //エラーを出しました。値を変えられません。
本質:
constが実際に保証しているのは、変数が変更できないのではなく、変数が指しているメモリアドレスに保存されているデータを変更してはいけません。
A、5種類の基本データタイプ(Number、String、Boolean、Unidefined、Null):値は変数が指すメモリアドレスに保存されていて、定数と同じです。値を変えられません
B、複雑なデータタイプ(Object:配列、オブジェクト):このタイプの変数名はデータを指すのではなく、データの所在地を指すもので、constは変数名が指すアドレスだけが変わらず、変更先のデータが変わらないことを保証するものではないので、このアドレスの属性値を修正することができますが、アドレスの指向を変えることはできません。

const a=[];
a.push("Hello"); //   ,           
a.length=0;   //   ,  
a=["Tom"];   //  ,        

const b ={};
b.prop=123;   // b      ,    
b.prop    //123
b={};    // b        ,    

          ,    Object.freeze  。
const b=Object.freeze({});
//      ,        ,b.prop undefined
//      ,     
b.prop = 123;
締め括りをつける
以上は小编が皆さんに绍介したvar、let、constの异同点です。皆さんに助けてほしいです。もし何か疑问がありましたら、メッセージをください。小编はすぐに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。