變量聲明包括let var const
在這之前,需要提一點:
如果一個變量沒有聲明直接被使用,那該變量自動會變爲全局變量。
i = 10; // i現在是全局變量
該缺陷是因爲 在js設計之初,爲了方便初學者而不要求強制申明變量導致的,
後面推出的strict模式修補了這一問題
在js代碼第一行寫上: 'use strict'
它的作用是在聲明瞭之後,會嚴格檢測該文件內的變量是否通過var申明,若無則報錯
它們的區別如下:
對其中的概念解釋如下:
1、作用域
作用域既是該值能夠生效,能夠被訪問的區域範圍。
var 爲全局作用域,let和const是局部作用域(僅在函數體內可用)
if(true) {
var a = 1;
let b = 2;
const c = 3;
}
console.log(a); // a打印值爲1
console.log(b); // b打印值爲 undefined
console.log(c); // c打印值爲 undefined
2、變量聲明
var 和 let可以僅聲明不賦值,但是const必須賦值,否則會報錯
var a = 1 //正確
let b = 1 //正確
const c = 1 //正確
var d //正確 d打印爲undefined
let e //正確 e打印爲undefined
const f //錯誤
3、是否可修改
var 和let聲明的變量可隨意修改,const聲明的變量 若爲基礎類型(undefined null string number boolean)則不可修改,若爲引用數據類型(object array), 可以修改值, 不可修改引用對象。
var a = 1;
a =2;
console.log(a) // 2
let b = 1;
b = 2;
console.log(b) // 2
//c爲基本數據類型不可修改
const c = 1;
c = 2; //報錯
//d爲引用數據類型
const d = [1,2,3];
d.push(4);//對引用數據類型進行值的修改可進行
console.log(d);// [1,2,3,4]
d[0] = 2; // [2,2,3,4]
d = [1,2,3,4,5] //對引用數據類型進行地址修改,報錯
簡單來講 就是const定義的變量 不可以直接修改該變量,若爲非基本數據類型,可以修改該變量的值
4、是否可重複聲明
var 可重複聲明 let和const不可重複聲明
var a = 1;
var a = 2; //不報錯,可重複聲明
console.log(a); // 2
//let 和 const 情況相同
let a = 3;//報錯,上面已經聲明過a(var 聲明的也不可以)
let b = 1;
let b =2; //報錯,上面已經聲明過b
5、變量 提升
var聲明的變量會進行變量提升,但是賦值不提升;let和const聲明的變量不會提升。
console.log(v1);
var v1 = 100;
function foo() {
console.log(v1);
var v1 = 200;
console.log(v1);
}
foo();
console.log(v1);
輸出結果爲 undefined undefined 200 100
爲什麼呢?
因爲這裏還有函數提升,
函數聲明的優先級是要高於變量聲明的 即 function foo() 的聲明,在代碼執行時會被提到最頂端
單純的變量提升
function test () {
console.log(a); //undefined
var a = 123;
};
test();
// 它的實際執行順序如下
function test () {
var a;
console.log(a);
a = 123;
}
test();
// 即對a的聲明被提到了最頂部去執行