let與const命令都是用來在js中聲明變數的,在使用上與var相似,但存在一些區別,下麵先講let同var的區別 let 怎麼使用呢,同var一樣,let 變數名 就可以聲明瞭 區別一:其作用域只能在當前執行的代碼塊中, 上面的例子中,let在代碼塊中聲明後,在代碼塊外引用就會報錯,其作用範圍只 ...
let與const命令都是用來在js中聲明變數的,在使用上與var相似,但存在一些區別,下麵先講let同var的區別
let
怎麼使用呢,同var一樣,let 變數名 就可以聲明瞭
區別一:其作用域只能在當前執行的代碼塊中,
{ let a=12; var b=12; console.log(a+"=="+b);//a==>12 b==>12 } console.log(a);// ReferenceError: a is not defined console.log(b);//12
上面的例子中,let在代碼塊中聲明後,在代碼塊外引用就會報錯,其作用範圍只限制在{ }裡面,有點跟函數的局部變數相似
我們可以發現這種做法挺適用於for迴圈中,這樣子可以做到在迴圈中的i不會被後面的代碼引用到
for(var i=0;i<6;i++); console.log(i);//6 for(let j=0;j<6;j++); console.log(j);//Uncaught ReferenceError: j is not defined
區別二:不能在同一個作用域內重覆聲明一個變數
我們知道用var聲明變數的時候可以重覆聲明,只是會改變數據存儲的指向,最直觀的例子就是for迴圈的時候習慣性重覆用var i 吧
但是let不允許重覆聲明,下麵代碼運行時會報錯
//報錯 { var a=12; let a=1; }
區別三:let聲明的變數不會進行預編譯,即將變數的聲明提前至代碼前面
console.log(a);//undefined var a=2; { console.log(b);//報錯 let b=2; }
區別四:暫時性死區(TDZ),let變數聲明的代碼塊中,其同名的全局變數(代碼塊外聲明的var)不會產生任何作用(簡單說就是被無視掉了)
{ var a=12; let a=11; console.log(a);//報錯,因為在用let聲明時,已經聲明瞭標識符a } var b=12; { let b=11; console.log(b);//11 } { tmp = 1; // 報錯 console.log(tmp); // 報錯 let tmp; console.log(tmp); // 報錯 tmp = 1; console.log(tmp); // 1 }
const
const用來聲明一個只讀的變數,聲明後變數不能改變
下麵開始一一說明:
首先const聲明時必須初始化,且聲明後不能重新賦值,否則都會報錯
const a;//報錯,未初始化 const b=1; b=2;//報錯,重覆賦值
其次,const與let在下麵方面有相似之處:
const的作用域同樣作用於聲明的代碼塊中
{ const c=1; } console.log(c);//報錯,為聲明定義
const在同一個作用域中不能重覆聲明
var message = "Hello!"; let age = 25; // 以下兩行都會報錯 const message = "Goodbye!"; const age = 30;
const不會進行預編譯(聲明的變數提前)
{ console.log(d);//報錯 const d=1; }
const同樣存在暫時性死區
var a=12; { const a= 1; console.log(a);//1
}
接下來對其變數值聲明後不能改變補充說明:這裡的不能改變指的是變數指向的地址不會發生改變
所以對於用const聲明的數組和對象,可以向其添加元素或者屬性,因為這些操作不會改變其本來變數指向的地址,但是重新賦值一個數組或者對象無論是啥都會報錯
const obj={}; obj.pro=1;//可以成功添加 console.log(obj.pro);//1 obj={};//報錯 const arr=[]; arr.push(1); console.log(arr);//[1] arr=['df'];//報錯