let、const和var的区别

146 阅读3分钟

一、var关键字

  1. var定义的变量可以修改的
  var a=1;
  console.log('函数外var定义a:',a)//可以输出a=1  
      a=4;
  console.log(a)//输出4

2.var声明的变量是函数作用域
(1)在函数内部使用var操作符定义局部变量,在调用之后变量会销毁,在函数外部不能访问 例:

        function test(){
            var message='hi';//局部变量
        }
        test();
        console.log(message);//报错

报错内容:

QQ截图20220406192933.png
(2)在函数内部定义变量的时候省略var操作符,创建一个全局变量,调用这个函数,在函数外部就能访问到,函数内部也可以访问到全局作用域中的变量 注意:

       var num='111'
       function test(){
           message='hi';//局部变量
           console.log(message)//hi
           console.log(num)//111  函数内部可以访问全局作用域中的变量num
        }
        test();
        console.log(message);//输出hi

3.var声明变量存在变量提升
(1)代码不会报错,使用这个关键字声明的变量会自动提升到函数作用于顶端

     function foo(){
       console.log(a)
       var a=2;
      }  
      foo()//undefined
     function foo(){
        var a
        console.log(a)
        a=26;
      }  
      foo()//undefined

(2)let和const不存在变量提升

     console.log(s);  //报错
     let s=10

报错内容:
1.png

    console.log(s);  //报错
    const s=10

报错内容:
2.png

4.var可以定义多个变量,在一条语句中用逗号隔开每个变量

     var a=10,
         b=11,
         v=12

5.同一作用域下,var可以重复声明相同的变量

   var a=5;
   var a=10;//5

6.var的变量会挂载到window上

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

二、let声明变量

1.使用let声明的变量具有块级作用域的特点
块级作用域由最近的一对花括号{}界定换句话说,if块、while块、、function块,甚至连单独的块也是let声明的变量的作用域。在变量的作用域之外,无法访问变量,会报错

   {
       let num='36';
       console.log(num);//36
    }
    console.log(num);//报错

报错内容:

1.png

  if(true){
       let num=12;
       console.log(num);//12
   }
   console.log(num);//报错 

报错内容:

1.png

  while(true){
       let num=12;
   }
   console.log(num);//报错:ReferenceError 
  function(true){
       let num=12;
   }
   console.log(num);//报错:ReferenceError 

报错内容:

1.png
2、同一作用域下不能使用let重复声明相同的变量
(1)同一作用域下不能使用let重复声明

    let num=66;
    let num=77;
    console.log(num)//报错

报错内容:

2.png
(2)不同作用域下,let可以声明相同的变量名的变量

    let num=66;
    function fun(){
        let num=65;
        {
          let num=63;
          console.log(num)//63
        }
        console.log(num)//65
    }
    console.log(num)//66
    

(3)相同作用域下不能重复声明并不受var关键字的限制

    var a=66;
    var a=45;
    let a=22;//报错

报错内容:

1.png
3.let的变量不会挂载到window上

   let a=1  //window.a
   console.log(a)//1
   console.log(window.a)//undefined

4.let存在暂时性死区

    var name='ll'
    function fn(){
      console.log(name)
      let name=14
    }
    fn()

报错内容:

QQ截图20220423101311.png

三、使用const声明常量

1、const声明常量必须赋初始值

   const a=14;//有效  
   cosnt b;//报错

报错内容:

QQ截图20220407204152.png

2、const声明的常量不能更改,如果声明的是复合数据类型,可以修改其属性

   const a=5;
         a=10;//报错  不能更改
   const arr=[]
         arr=[1,2]//报错  改变了内存指针的指向
         arr.push(1);//[1] 知识修改指针指向的内存地址里的属性

报错内容:

2.png
3、const也存在块级作用域

   {
       const num='36';
       console.log(num);//36
    }
    console.log(num);//报错

报错内容:

1.png
4、let和var声明的变量,const不能重复声明

    var a=4;
    let b=5;
    const a=8;//报错
    const b=7;//报错

报错内容:
2.png
5.const的变量不会挂载到window上

   const a=1  //window.a
   console.log(a)//1
   console.log(window.a)//undefined

6.const存在暂时性死区

    var name='ll'
    function fn(){
      console.log(name)
      const name=14
    }
    fn()

报错内容:

QQ截图20220423101311.png