var, let和const的区别?(js)

1.var

    global = 123
    console.log('没有定义的global:', global)
    var global; // 变量提升:所有的声明(定义的变量:global)都会提升到作用域的最顶上去
    function foo() {
      console.log('函数中的global变量:', global)
      if (i = 1) {
        console.log('if中的global变量:', global)
        for (var i = 1; i < 8; i++) {
          console.log('for中的global:', global)
        }
      }
    }
    foo()
    global = 456
    console.log('修改后的global:', global)

效果图:
在这里插入图片描述

结论:只要var定义了变量(a),可以重复定义,你在任何地方(作用域:访问到变量的区域)都可以访问到变量(a),并且可以修改。

2. let

	 a = '123'
    console.log('没有定义的a:', a)  // 报错  Uncaught ReferenceError: Cannot access 'a' before initialization
    let a;

效果图:
在这里插入图片描述
在这里插入图片描述

	let a;
    console.log('let定义的a:', a)
    a = '123'
    console.log('let定义并赋值的a:', a)
    function foo() {
      console.log('函数中的a变量:', a)
      if (i = 1) {
        console.log('if中的a变量:',)
        for (var i = 1; i < 8; i++) {
          console.log('for中的a:', a)
        }
      }
    }
    foo()
    a = 456
    console.log('修改后的a:', a)

在这里插入图片描述
结论:使用let定义变量不能重复定义,否则会报错,let可以修改值。
3.const

    a = 123
    console.log('a:', a)  //报错 Uncaught SyntaxError: Missing initializer in const declaration
    const a;

在这里插入图片描述

    const b = 123
    console.log('const定义并赋值的b:', b)
    function foo() {
      console.log('函数中的b变量:', b)
      if (i = 1) {
        console.log('if中的b变量:',)
        for (var i = 1; i < 8; i++) {
          console.log('for中的b:', b)
        }
      }
    }
    foo()
    b = 456
    console.log('修改后的b:', b) // Uncaught TypeError: Assignment to constant variable.

在这里插入图片描述
结论:const 定义的变量(b)必须赋值,不能重复定义,不能修改值。
const 创建的对象

   const obj = {
      a: '对象中的a'
    }
    console.log('obj中的a:', obj.a)
    obj.a = '修改对象中obj的a'
    console.log('修改obj的a,', obj.a)

在这里插入图片描述

为什么没有报错呢?

const定义的对象指针指向的对象地址不可以改变,指向对象地址的内容(obj.变量的值)是可以改变的。对象的内容改变不会影响到指针(obj地址)的改变,对象的属性内容是可以修改的。
const定义基本数据类型(undefined,null,Boolean,Number和String)的变量是不可以修改,其它复杂数据类型(object(对象),(Array)数组)是可以修改的。

总结:

1.var定义的变量存在变量提升(所有的声明都会提升到作用域的最顶上去),可以重复定义,可以在任意地方(作用域中)访问到变量。var 定义的变量可以被修改。
2.let定义的变量不存在变量提升,不可以重复定义,let 定义的变量可以被修改。
3.const定义的变量必须赋值,不存在变量提升,不可以重复定义,const定义的基础数据类型(undefined,null,Boolean,Number和String)的变量不能被修改,但是可以修改复杂数据类型(object(对象),(Array)数组)的属性值。
补充:
块级作用域:由 { } 包裹,其中if和for语句的{ }也属于块作用域。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值