var,let,const的區別和用法


let 和 const 是ES6后新增的,同時也新增了塊級作用域(大括號內{})

一、主要區別:

使用 var 聲明的變量,其作用域為該語句所在的函數內,且存在變量提升現象
使用 let 聲明的變量,其作用域為該語句所在的代碼塊內,不存在變量提升
使用 const 聲明的是常量,在后面出現的代碼中不能再修改該常量的值

同一作用域下let和const不能聲明同名變量,而var可以
暫存死區(當前作用域頂部到該變量聲明位置中間的部分,都是該let變量的死區,在死區中,禁止訪問該變量。由此,let聲明的變量不存在變量提升, 但是由於死區我們無法在聲明前訪問這個變量。)
全局作用域中var聲明的變量,通過function聲明的函數,會自動變成window對象的屬性或方法,而let 和 const 聲明的就不會

    var a=1;
    console.log(window.a);//1

    let b=2;
    console.log(window.b);//undefined

兩個經典面試題解析

var arr = [];
for (var i = 0; i < 2; i++) {
 arr[i] = function () {
 console.log(i);
 }
}
arr[0]();  //2
arr[1]();  //2

以上for循環結束后最終 i=2時退出循環,此時全局中保存一個i=2,后續調用arr[0].arr[0],輸出2

let arr = [];
for (let i = 0; i < 2; i++) {
 arr[i] = function () {
 console.log(i);
 }
}
arr[0](); //0
arr[1](); //1

由於let有塊級作用域,每次循環都會產生一個塊級作用域,每個塊級作用域中的變量都是不同的,
函數執行時輸出的是自己上一級(循環產生的塊級作用域)作用域下的i值.

二、使用注意點

1、var具有變量提升和全局作用域

(1)變量提升:把變量的申明提升到作用域的最前面

console.log(num);
var num=10;
//變量提升
var num;
console.log(num);
num=10;

輸出:undefined
注意:js中的方法function也具有變量提升
(2)全局作用域

for(var i=1;i<3;i++){

}
 console.log(i); //3
//對比let,塊級作用域
for(let i=1;i<3;i++){

}
 console.log(i); //i is not defined

2、let申明變量

(1) let聲明的變量只在所處於的塊級有效

if (true) {
 let a = 10;
}
console.log(a) // a is not defined

注意:使用let關鍵字聲明的變量才具有塊級作用域,使用var聲明的變量不具備塊級作用域特性。
(2) 不存在變量提升

console.log(a); // a is not defined
let a = 20;

(3) 暫時性死區

var tmp = 123;
if (true) {
//在當前塊作用域中存在tmp 使用let/const聲明的情況下,給tmp 賦值10時,只會在當前作用域找變量tmp ,而這時,還未到聲明時候,所以控制台Error:tmp is not defined
 tmp = 10;
 let tmp;
} 
//控制台輸出 tmp is not defined

3、const聲明常量,常量就是值(內存地址)不能變化的量。

常量賦值后,值不能修改。

const PI = 3.14;
PI = 100; // Assignment to constant variable.

const ary = [100, 200];
ary[0] = 'a';
ary[1] = 'b';
console.log(ary); // ['a', 'b'];
ary = ['a', 'b']; // Assignment to constant variable.

注意:ary[0]='a'內存地址沒變,而使用 ary = ['a', 'b'] 直接賦值,改變了內存地址所以報錯


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM