es是標(biāo)準(zhǔn)话肖,js是實(shí)現(xiàn) es6是JavaScript語(yǔ)言的下一代標(biāo)準(zhǔn)
let 聲明的變量是區(qū)塊變量。
*代碼塊內(nèi)有效
let 只在 let 命令所在的代碼塊內(nèi)有效绑莺,var 是在全局范圍內(nèi)有效
*不能重復(fù)聲明
let 只能聲明一次 var 可以聲明多次
*不存在變量提升
let 不存在變量提升颤芬,var 會(huì)變量提升
for (var i = 0; i < 10; i++) {
setTimeout(function(){
console.log(i);
})
}
// 輸出十個(gè) 10
//原因:setTimeout是一個(gè)宏任務(wù)擎析,它在事件隊(duì)列里排在了script標(biāo)簽這個(gè)宏任務(wù)的后面。
//瀏覽器會(huì)先執(zhí)行第一個(gè)宏任務(wù)轧拄,也就是讀取script標(biāo)簽中的代碼揽祥,遇到setTimeout時(shí),
//將其放進(jìn)事件隊(duì)列中等待執(zhí)行檩电,循環(huán)10次拄丰,也就是事件隊(duì)列中放了10個(gè)setTimeout,
//這時(shí)第一個(gè)事件執(zhí)行完畢俐末,再執(zhí)行下一個(gè)宏任務(wù)愈案,也就是依次執(zhí)行setTimeout,
//這時(shí)i已經(jīng)變成了10鹅搪,所以會(huì)打印出十個(gè)10站绪;
for (let j = 0; j < 10; j++) {
setTimeout(function(){
console.log(j);
})
}
// 輸出 0123456789
//原因:因?yàn)閘et i 的是區(qū)塊變量,每個(gè)i只能存活到大括號(hào)結(jié)束丽柿,
//并不會(huì)把后面的for循環(huán)的 i 值賦給前面的setTimeout中的i恢准;
//而var i 則是局部變量,這個(gè) i 的生命周期不受for循環(huán)的大括號(hào)限制
const 聲明一個(gè)只讀的常量甫题,一旦聲明馁筐,常量的值就不能改變。
- const 其實(shí)保證的不是變量的值不變坠非,而是保證變量指向的內(nèi)存地址所保存的數(shù)據(jù)不允許改動(dòng)敏沉,也就是指針是固定的,但是指向的內(nèi)容無(wú)法控制炎码。
就像是抽屜的鑰匙盟迟,明確指向是哪個(gè)抽屜,但是抽屜里面可以放不同的東西潦闲。 - 使用 const 聲明復(fù)雜類型對(duì)象時(shí)要慎重
對(duì)于簡(jiǎn)單類型(數(shù)值 number攒菠、字符串 string 、布爾值 boolean),指向的那個(gè)內(nèi)存地址歉闰,因此 const 聲明的簡(jiǎn)單類型變量等同于常量辖众。
對(duì)于復(fù)雜類型(對(duì)象 object卓起,數(shù)組 array,函數(shù) function)凹炸,變量指向的內(nèi)存地址其實(shí)是保存了一個(gè)指向?qū)嶋H數(shù)據(jù)的指針