ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ES6知识梳理

2021-07-25 22:29:35  阅读:147  来源: 互联网

标签:ES6 const 变量 知识 关键字 let var 声明 梳理


1、let关键字

1.1、var 和 let 关键字之间的差异

使用 var 关键字来声明变量,会出现重复声明导致变量被覆盖却不会报错的问题。
let 是在代码块内有效,var 是在全局范围内有效

var camper = 'James';
var camper = 'David';
console.log(camper);

在这里插入图片描述
在 ES6 中引入了新的关键字 let 来解决 var 关键字带来的潜在问题。 如果在上面的代码中使用 let 关键字来代替 var 关键字,结果会是一个报错。
在这里插入图片描述

1.2、var 和 let 关键字的作用域

  • 使用 var 关键字来声明一个变量的时候,这个变量会被声明成全局变量,或是函数内的局部变量
  • let 关键字的作用与此类似,但会有一些额外的特性。 如果在代码块、语句或表达式中使用关键字 let 声明变量,这个变量的作用域就被限制在当前的代码块、语句或表达式之中

1.2.1、

存储的函数会总是指向更新后的全局 i 变量的值

var printNumTwo;
for (var i = 0; i < 3; i++) {
  if (i === 2) {
    printNumTwo = function() {
      return i;
    };
  }
}
console.log(printNumTwo());
console.log(i);

在这里插入图片描述
可以看到,printNumTwo() 打印了 3,而不是 2。 这是因为赋值给 i 的值已经更新,printNumTwo() 返回全局的 i,而不是在 for 循环中创建函数时 i 的值。

for (var i = 0; i < 10; i++) {
  setTimeout(function(){
    console.log(i);
  })
}

在这里插入图片描述

变量 i 是用 var 声明的,在全局范围内有效,所以全局中只有一个变量 i, 每次循环时,setTimeout 定时器里面的 i 指的是全局变量 i ,而循环里的十个 setTimeout 是在循环结束后才执行,所以此时的 i 都是 10

在这里插入图片描述
变量 j 是用 let 声明的,当前的 j 只在本轮循环中有效,每次循环的 j 其实都是一个新的变量,所以 setTimeout 定时器里面的 j 其实是不同的变量,即最后输出 12345。(若每次循环的变量 j 都是重新声明的,如何知道前一个循环的值?这是因为 JavaScript 引擎内部会记住前一个循环的值)

1.2.2、

let printNumTwo;
for (let i = 0; i < 3; i++) {
  if (i === 2) {
    printNumTwo = function() {
      return i;
    };
  }
}
console.log(printNumTwo());
console.log(i);

在这里插入图片描述
i 未定义,因为它没有在全局范围内声明。 它只在 for 循环语句中被声明。 printNumTwo() 返回了正确的值,因为 let 关键字在循环语句中使 i 变量产生了三个不同的值(分别为 0、1、2)

1.3、变量提升

1.3.1、let 不存在变量提升

在这里插入图片描述
变量 a 用 let 声明不存在变量提升,在声明变量 a 之前,a 不存在,所以会报错

1.3.2、var 会变量提升

在这里插入图片描述
变量 b 用 var 声明存在变量提升,所以当脚本开始运行的时候,b 已经存在了,但是还没有赋值,所以会输出 undefined。

2、const 常量

const 声明一个只读变量,声明之后不允许改变。意味着,一旦声明必须初始化,否则会报错。通过 const 声明的变量只能被赋值一次,而不能被再次赋值。

2.1、声明

对所有常量的命名采用全大写字母,并在单词之间使用下划线进行分隔

2.2、暂时性死区:

var PI = "a";
if(true){
  console.log(PI);  // ReferenceError: PI is not defined
  const PI = "3.1415926";
}

ES6 明确规定,代码块内如果存在 let 或者 const,代码块会对这些命令声明的变量从块的开始就形成一个封闭作用域。代码块内,在声明变量 PI 之前使用它会报错。

2.3可改变但是不能重新赋值

在使用 const 声明的时候依然是可变的。 使用 const 来声明只会保证变量不会被重新赋值

在这里插入图片描述
在这里插入图片描述
和所有数组一样,数组 s 中的元素是可以被改变的,但是因为使用了 const 关键字,不能使用赋值操作符将变量标识 s 指向另外一个数组。

2.4、const 原理

const 如何做到变量在声明初始化之后不允许改变的?其实 const 其实保证的不是变量的值不变,而是保证变量指向的内存地址所保存的数据不允许改动。简单类型和复合类型保存值的方式是不同的。是的,对于简单类型(数值 number、字符串 string 、布尔值 boolean),值就保存在变量指向的那个内存地址,因此 const 声明的简单类型变量等同于常量。而复杂类型(对象 object,数组 array,函数 function),变量指向的内存地址其实是保存了一个指向实际数据的指针,所以 const 只能保证指针是固定的,至于指针指向的数据结构变不变就无法控制了,所以使用 const 声明复杂类型对象时要慎重。

2.5、 Object.freeze

当一个对象被冻结的时候,不能再对它的属性再进行增、删、改的操作。 任何试图改变对象的操作都会被阻止,却不会报错

let obj = {
  name:"Jack",
  review:"Awesome"
};
Object.freeze(obj);
obj.review = "bad";
obj.newProp = "Test";
console.log(obj); 

在这里插入图片描述

标签:ES6,const,变量,知识,关键字,let,var,声明,梳理
来源: https://blog.csdn.net/weixin_45985175/article/details/119087634

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有