let和var
let是ES6中新增的命令,它的用法和var類似汰聋。
主要有以下區(qū)別:
1.作用域不一樣
let是塊作用域门粪,var是函數(shù)作用域。
let聲明的變量只在它所在的代碼塊有效烹困。適合使用的場(chǎng)景有循環(huán)等
for (let i = 0; i < 10; i++) {
// ...
}
console.log(i);
// ReferenceError: i is not defined
var聲明的變量在函數(shù)內(nèi)全局有效
- let不能在定義之前訪問該變量玄妈,但是var是可以
if (true) {
let tmp; //
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
3.let不能被重新定義,但是var是可以的
// 報(bào)錯(cuò)
function func() {
let a = 5;
var a = 2;
}
// 報(bào)錯(cuò)
function func() {
let a = 5;
let a = 2;
}
let和const
相同點(diǎn)
const的作用域與let相同:只在聲明所在的塊級(jí)作用域內(nèi)有效髓梅。
const聲明的常量拟蜻,也與let一樣不可重復(fù)聲明。
var message = "Hello!";
let age = 25;
// 以下兩行都會(huì)報(bào)錯(cuò)
const message = "Goodbye!";
const age = 30;
**const的本質(zhì)
const保證的是變量指向的那個(gè)內(nèi)存地址所保存的數(shù)據(jù)不得改動(dòng)女淑。對(duì)于簡單類型的數(shù)據(jù)(數(shù)值、字符串辜御、布爾值)鸭你,值就保存在變量指向的那個(gè)內(nèi)存地址,相當(dāng)于常量擒权。
對(duì)于復(fù)合類型的數(shù)據(jù)(主要是對(duì)象和數(shù)組)袱巨,變量指向的內(nèi)存地址,保存的只是一個(gè)指向?qū)嶋H數(shù)據(jù)的指針碳抄,const只能保證這個(gè)指針是固定的(即總是指向另一個(gè)固定的地址)愉老,至于它指向的數(shù)據(jù)結(jié)構(gòu)是不是可變的,就完全不能控制了剖效。
const foo = {};
// 為 foo 添加一個(gè)屬性嫉入,可以成功
foo.prop = 123;
foo.prop // 123
// 將 foo 指向另一個(gè)對(duì)象焰盗,就會(huì)報(bào)錯(cuò)
foo = {}; // TypeError: "foo" is read-only
const的獨(dú)有特點(diǎn):
const聲明一個(gè)只讀的常量。一旦聲明咒林,常量的值就不能改變熬拒。
因此,聲明變量時(shí)垫竞,就必須立即初始化澎粟,不能留到以后賦值。
const foo;
// SyntaxError: Missing initializer in const declaration
參考資料:
let 和 const 命令