let命令
- let命令用來定義變量,其定義的變量只在代碼塊內(nèi)有效
而var定義的變量在全局范圍內(nèi)都有效
{
var p=2;
let a = 1;
}
p // 2
a // ReferenceError
- let命令沒有變量提升
若在定義一個變量之前使用該變量則會拋出 ReferenceError 錯誤
而var則會將該變量視為 undefined
p = 3;
let p; // ReferenceError
console.log(a); // 輸出undefined
var a = 2;
(這個特性會迫使程序猿們養(yǎng)成先定義后使用的習慣, 同時避免var的 undefined 產(chǎn)生難以查找的錯誤)
- let不允許重復聲明同一變量
{
var a;
let a; // error
}
{
let a=1;
let a; //error
}
const命令
- const用來聲明一個只讀的常量, 一旦聲明强岸,常量的值不可改變
聲明時必須初始化,否則會報錯
const a = 1;
a = 5; //TypeError: Assignment to constant variable.
const p; //SyntaxError: Missing initializer in const declaration
- const 只在聲明其所在的塊級作用域內(nèi)有效
- const 命令聲明的常量也沒有變量提升坟瓢,只能在聲明的位置后面使用
- 同樣不可重復聲明同一變量
注意:
對于復合類型的變量常熙,變量名不指向數(shù)據(jù)喉磁,而是指向數(shù)據(jù)所在的地址。const命令只是保證變量名指向的地址不變涕癣,并不保證該地址的數(shù)據(jù)不變
const a = [];
a.push('Java'); // 可運行 此時a為['Java']
a = ['script']; // error
塊級作用域的優(yōu)點
- 避免內(nèi)層變量覆蓋外層變量
- 避免用來計數(shù)的循環(huán)變量泄露為全局變量
-
引入了塊級作用域哗蜈,允許在塊級作用域之中聲明函數(shù)
so
const 和 let 用起來