var、let、const 区别

var、let 声明变量

 区别

  1.作用域

// 块级区域
{
    var a=10;
    let b=20;
}

console.log(a); //10
console.log(b); //引用错误  b is not defined

  可以看到,var声明在块级区域以外有效,是可以获取到的,而let声明出了块级区域就无效了。

   var声明具有变量提升能力,无论在哪声明,均作为顶部声明全局有效)。

   let声明不具变量提升能力,离开块级区域,变量即刻失效

 

  2.逻辑

   在声明前使用

console.log(a); //undefined
var a;

console.log(b); //Cannot access 'b' before initialization
let b;

   var 变量提升而导致逻辑怪异,在声明前后使用都为undefined

   let 声明后使用为undefined,声明前使用返回引用错误  

 

  3.暂时性死区

 if(true){

    // 死区start
    val=10;
    console.log(10); //10
    // 死区end

    let val; //引用错误
}

   使用let声明,引用错误,在声明之前的区域将为死区,即必须按照规范让声明在前。

   使用var声明,返回 10,但以逻辑来看是不正确的。

 

  4.重复声明

var val=10;
var val=200;
console.log(val); //200

let val=10;
let val=200;
console.log(val); //引用错误

   var可重复声明同一个变量,后声明的值覆盖前一个值

   let不可重复声明同一变量,直接报错

 

  即便同var一起声明,也会报错,只要使用let声明变量,该变量不能声明第二次

let val=10;
var val=200;
console.log(val);

  

  若分别处于作用域内外两部分,则是可以并存的

let val=10;

{
    let val=20;
    console.log(val); //20
}

console.log(val); //10

 

 

在循环中分别使用var let
  • var是作用于全局的,如果后续再使用就会引起干扰
for (var i = 0; i < 3; i++) {
     console.log(i); //0 1 2
}
console.log(i); //3

 

  • let只在循环内有效,循环作为作用域,在循环外是获取不到的,防止干扰
for (let i = 0; i < 3; i++) {
    console.log(i); //0 1 2
}
console.log(i); //错误

 

遍历数组

 
var arr=[];
    for (var i = 0; i < 3; i++) {
        arr[i]=function(){
        console.log(i);
    }
}
arr[1](); //无论设置多少,均为3


for (let i = 0; i < 3; i++) {
    arr[i]=function(){
        console.log(i);
    }
}
arr[2](); //可设置索引得到需要的值
    

 

 

const 声明只读常量,常量约定俗成字母大写
  • 值不可以更改,改变则报错

const A=10;
A=100;
console.log(A);

 

 

  • 一旦声明即刻赋值,否则报错

const A;
A=10;
console.log(A);

 

  • 同let声明,声明的常量无法提升,有暂存死区

 console.log(A); //Cannot access 'A' before initialization
 const A=10;

 

 

 

 

 

 

 

   

 

posted @ 2021-11-23 20:00  十七日尾  阅读(123)  评论(0)    收藏  举报