zoukankan      html  css  js  c++  java
  • let、var、const区别(表格比较)

    let、var、const区别(表格比较):

    区别项 let var const
    作用域 块级作用域 全局作用域或函数作用域 块级作用域
    是否有变量提升
    是否可重复声明 不可 可以 不可
    是否属于顶层对象的属性 不属于 全局作用域时,属于 不属于
    值不变 常量值不变是指指向的内存地址不变,复合数据类型可改变内部数据
    • const 实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。
      对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。
      但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。

    • let

    1. let 块级作用域内有效。
    2. let 不存在变量提升;变量一定要在声明后使用,否则报错
    3. let 不可重复声明
    4. let 声明的变量,不属于顶层对象的属性
    • var
    1. var 全局作用域或函数作用域
    2. var 有”变量提升“现象,即变量可以在声明之前使用,值为undefined。
    3. var 允许重复声明
    4. var 全局作用域时,属于顶层对象的属性
    • const:声明一个只读的常量。定义时,就必须立即初始化。一旦声明,常量指向的内存地址就不能改变。
    1. const 块级作用域内有效
    2. const 不存在变量提升
    3. const 不可重复声明
    4. const 声明的变量,不属于顶层对象的属性
    5. const 是指定义的变量指向的那个内存地址不得改动,不能控制变量的数据内容。
    • var 变量声明无论出现在代码的任何位置,都会在任何代码执行之前处理。
      使用var语句声明的变量的作用域是当前执行位置的执行环境(也叫做执行上下文):一个函数的内部(声明在函数内)或者全局(声明在函数外)。

    • 顶层对象,在浏览器环境指的是window对象,在Node指的是global对象。

    • for循环有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。

    for (let i = 0; i < 3; i++) {
      let i = 'abc';
      console.log(i);
    }
    // abc
    // abc
    // abc
    

    上面代码正确运行,输出了3次abc。这表明函数内部的变量i与循环变量i不在同一个作用域,有各自单独的作用域。

    • 暂时性死区
      只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
    var tmp = 123;
    if (true) {
      tmp = 'abc'; // ReferenceError
      let tmp;
    }
    

    上面代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。
    ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
    总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

    if (true) {
      // TDZ开始
      tmp = 'abc'; // ReferenceError
      console.log(tmp); // ReferenceError
      let tmp; // TDZ结束
      console.log(tmp); // undefined
      tmp = 123;
      console.log(tmp); // 123
    }
    

    上面代码中,在let命令声明变量tmp之前,都属于变量tmp的“死区”。

  • 相关阅读:
    第一行代码读书规划
    drawable文件夹详解
    index.do为后缀的是什么开发语言? 有什么技术特点?
    Activity与Fragment的生命周期
    正则例六
    iOS开发之--NSNotificationCenter的使用
    iOS开发之--MVC 架构模式
    iOS开发之--使用storyboard进行跳转
    swift
    iOS开发之-- oc 和 swift混编之自建桥接文件
  • 原文地址:https://www.cnblogs.com/cag2050/p/7543967.html
Copyright © 2011-2022 走看看