建議把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);//['小明', '杰倫', '阿姨','老媽', '老爸'];