建議把var換成let

透過下方可以發現,宣告var時變數就會在網頁佔有記憶體空間(var提升的特性),但如果是let,在還沒讀取到時是無法被取用該變數

console.log(mom); //undefined
var mom = '媽媽';

//--------------
console.log(mom); //no defined
let mom = '媽媽';

var 與 let作用域的差別

var作用域 → function scope

function varMan(){
	var man = '大夫';
	if(true){
		var man ='瘦虎'
	}
	console.log(man); //瘦虎
}

let作用域 → block

function varMan(){ //let作用域只在大括號內
	let man = '大夫';
	if(true){  
		let man ='瘦虎'
	}
	console.log(man); //大夫
}

for迴圈中的差異

for (var i = 0; i < 10; i++) {
  console.log(i);
  setTimeout(function () {
    console.log('這執行第' + i + '次');
  }, 10);
}
//會回傳0 1 2 3 .....9 ,和最後的非同步setTimeout (這執行第10次)

//------------間隔-------------

for (let i = 0; i < 10; i++) {
  console.log(i);
  setTimeout(function () {
    console.log('這執行第' + i + '次');
  }, 10);
}

//每跑一次回傳一次結果 0 ,這執行第0次   ......1  2 3 

const為宣告一個不能被更改的常數

const man = '技安';
man = '胖虎'; //跳錯

const在物件內可以指定屬性

因為物件為傳參考,只要在沒有替換參考的情況下皆可ˋ以替換

const family = {
  mom: '老媽',
  me: '小明',
  sister: '小橙'
};
family.mom = '爸爸';
console.log(family);//mom:爸爸 me:.....
family = {}; //跳錯

用立即涵式現置變數作用域

for (var i = 0; i < 10; i++) {
  console.log(i);
  (function(i){
    setTimeout(function () {
      console.log('這執行第' + i + '次');
    }, 10);
  })(i);
}
//0 1 2 ....
//這執行第0次 這執行第1次.....

展開與其餘參數

合併兩個物件

let groupA = ['小明', '杰倫', '阿姨'];
let groupB = ['老媽', '老爸'];
let groupAll = groupA.concat(groupB);
console.log(groupAll);//['小明', '杰倫', '阿姨','老媽', '老爸'];