1. 程式人生 > >es6學習筆記(二)

es6學習筆記(二)

es6學習筆記(二)

let 和 const 命令

let特性總結

  • let宣告的變數只在其所在的塊級作用域內有效,大括號即為 一個作用域
//for迴圈還有一個特別之處,就是設定迴圈變數的那部分是一個父作用域,而迴圈體內部是一個單獨的子作用域。
for (let i = 0; i < 3; i++) {
 let i = 'abc';
 console.log(i);
}
// abc
// abc
// abc
  • let宣告的變數不存在變數提升,變數必須在使用前宣告否則會報錯
  • 暫時性死區:在一個塊中只要用let或者const有宣告該變數,都不能在宣告前使用該變數,否則會報錯,即使全域性中存在該變數
     var tmp = 123;
    
     if (true) {
       tmp = 'abc'; // ReferenceError
       let tmp;
     }
    
  • let不允許在相同作用域內,重複宣告同一個變數。不能在函式內部重新宣告引數。

const特性總結

  • const宣告一個只讀的常量。一旦宣告,常量的值就不能改變,這意味著,const一旦宣告變數,就必須立即初始化,不能留到以後賦值。
  • 只在宣告所在的塊級作用域內有效。
  • const命令宣告的常量也是不提升,同樣存在暫時性死區,只能在宣告的位置後面使用
  • const宣告的常量,也與let一樣不可重複宣告。
  • 本質:const實際上保證的,並不是變數的值不得改動,而是變數指向的那個記憶體地址所儲存的資料不得改動。
    const foo = {};
    
    // 為 foo 新增一個屬性,可以成功
    foo.prop = 123;
    foo.prop // 123
    
    // 將 foo 指向另一個物件,就會報錯
    foo = {}; // TypeError: "foo" is read-only
    

解構賦值

  1. 陣列解構賦值
    //第一個程式碼塊
    {
      let a,b,rest;
      [a,b]=[1,2];
      console.log(a,b); //1,2
    }
    //第二個程式碼塊
    {
      let a,b,rest;
      [a,b,...rest]=[1,2,3,4,5,6];
      console.log(a,b,rest); //1,2,[2,3,4,5,6]
    }
    //預設值
    {
    	let a,b,c,rest;
    	[a,b,c=3]=[1,2];
    	console.log(a,b,c);  //1,2,3
    }
    //交換值
    {
    	let a=1;
    	let b=2;
    	[a,b]=[b,a];
    	console.log(a,b);  //2,1
    }
    //函式結果
    {
    	function f(){
    		return [1,2];
    	}
    	let a,b;
    	[a,b]=f();
    	console.log(a,b) //1,2
    }
    //獲取只能的資料
    {
    	function f(){
    		return [1,2,3,4,5]
    	}
    	let a,b,c;
    	[a,,,b]=f();
    	console.log(a,b) //1,4
    }
    //函式返回的陣列不確定
    {
    	function f(){
    		return [1,2,3,4,5]
    	}
    	let a,b,c;
    	[a,...b]=f();
    	console.log(a,b) //1,[2,3,4,5]
    }
    
  2. 物件解構賦值
    {
     let a,b;
      ({a,b}={a:1,b:2});
      console.log(a,b); //1,2
    }
    //第二個程式碼塊
    {
      let a,b,rest;
      [a,b,...rest]=[1,2,3,4,5,6];
      console.log(a,b,rest); //1,2,[2,3,4,5,6]
    }
    //物件賦值
    {
      let o={p:42,q:true};
      let {p,q}=o;
      console.log(p,q); //42,true
    }
    //預設值
    {
      let {a=10,b=5}={a:3};
      console.log(a,b);
    }
    //json賦值
    {
    	 let metaData={
    	    title:'abc',
    	    test:[{
    	      title:'test',
    	      desc:'description'
    	    }]
    	  }
    	  let {title:firstTitle,test:[{title:secondTest}]}=metaData;
    	  console.log(firstTitle,secondTest);
    }