关于ES6的let和const

栏目: IT技术 · 发布时间: 4年前

变量

var存在的问题

  1. 可以重复声明
  2. 无法限制修改
  3. 没有块级作用域 (在全局范围内有效)
  4. 存在变量提升

const/let

  1. 不可以重复声明
let a = 1;
        let a = 2;
        var b = 3;
        var b = 4;
        a  // Identifier 'a' has already been declared
        b  // 4
  1. const 不可以修改(定义常量)、let 可以修改(定义变量)
{
        let a = 0;
        var b = 1;
        }
        a  // ReferenceError: a is not defined
        b  // 1
  1. 有块级作用域
for (var i = 0; i < 10; i++) {
            setTimeout(function(){
                console.log(i);
            }
        }
        // 输出十个 10
        //由于var声明的变量i是在全局范围内有效,所以全局中只有一个i,setTimeout定时器里面的i指的是全局变量i,而循环里的是个setTimeout是在循环结束后才执行的,所以此时的i都是10。

        // 可以利用函数function来解决该问题
        for (var i = 0; i < 10; i++) {
            (function (i){
                setTimeout(function(){
                    console.log(i);
                }
            })(i)
        }
        // 输出 0123456789
        

        for (let j = 0; j < 10; j++) {
            setTimeout(function(){
                console.log(j);
            })
        }
        // 输出 0123456789
        // 每次循环都是一个新的变量
        // 问题来了,若每次循环的变量 j 都是重新声明的,如何知道前一个循环的值?这是因为 JavaScript 引擎内部会记住前一个循环的值
  1. 不存在变量提升
console.log(b);  //undefined
    var b = "banana";  
    // 变量b用var 来声明,存在变量提升,当脚本运行时,b已经存在了,但是还没有赋值,所以会出现undefined

    console.log(a);  //ReferenceError: a is not defined
    let a = "apple";
  1. const声明一个只读变量,声明之后不允许改变。意味着,一旦声明,必须初始化,否则会报错。
const a = 1;

        const b;  // SyntaxError: Missing initializer in const declaration

问题来了,为什么const可以在变量声明初始化之后不允许改变呢?

const 其实保证的不是变量的值不变,而是保证变量指向的内存地址所保存的数据不允许变动。

问题又来了,不同数据类型(简单类型,复合类型(或称引用类型))保存值的方式是不同的。

  • 对于简单类型(number,string,boolean),值就保存在指向的内存地址,因此const声明的简单类型变量等同于常量。

  • 对于复合类型(object,array,function),变量指向的内存地址其实保存了一个指向实际数据的指针,所以const只能保证指针是固定的,至于指针指向的数据结构就无法保证其不改变,所以const声明复杂类型对象时要慎重。

这其中涉及到了,简单类型和复合类型的保存方式

  • 基本类型值在内存中占固定大小的空间,因此被保存在栈内存中
  • 复合类型的值是对象,保存在堆内存中

当两者分别进行变量复制的时候

  1. 基本类型:会在变量对象上创建一个新值,然后把该值复制到为新的变量分配的位置。
var num1 = 1;
      var num1 = num2;
num1 1 (number类型)

复制后的变量对象

num2 1(number类型)
num1 1 (number类型)
  1. 复合类型:
var obj1 = new Object();
      var obj2 = obj1;
      obj1.name = "Tom";
      alert(obj2.name);// "Tom"

关于ES6的let和const


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Spring in Action

Spring in Action

Craig Walls / Manning Publications / 2011-6-29 / USD 49.99

Spring in Action, Third Edition has been completely revised to reflect the latest features, tools, practices Spring offers to java developers. It begins by introducing the core concepts of Spring and......一起来看看 《Spring in Action》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具