当前位置:   article > 正文

ES6简介_es6是什么

es6是什么

一、什么是ES6?

ES的全称是ECMAScript,它是由ECMA国际标准化组织制定的一项脚本语言的语法规范

ES6实际上是一个泛指,泛指ES2015及后续的版本

二、为什么使用ES6?

三、ES6的新增语法
 

1.let

ES6中新增的用于声明变量的关键字

  • let声明的变量只在所处的块级有效,具有块级作用域(一对{}中声明的)
  1. if(true) {
  2. let a = 10;
  3. }
  4. console.log(a); //a is not defined

注意:使用let关键字声明的变量才具有块级作用域,使用var声明的变量不具备块级作用域特性

  1. <script type="text/javascript">
  2. /*
  3. let关键字就是用来声明变量的
  4. 使用let关键字声明的变量具有块级作用域
  5. 在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的
  6. */
  7. /* -------在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的--------- */
  8. if (true) {
  9. var a = 10;
  10. let b = 20;
  11. }
  12. console.log(a);
  13. console.log(b);
  14. </script>

 

  • 防止循环变量变成全局变量

在我们for循环的时候,如果使用var来声明变量,即使已经循环完了,在for循环的外面还是能访问得到这个计数的变量,如果使用了let(即使let是在for的括号里而不是在{}里,它依然和for的块级作用域绑定),就不能在for循环的外面使用该变量

  1. <script type="text/javascript">
  2. /*
  3. let关键字就是用来声明变量的
  4. 使用let关键字声明的变量具有块级作用域
  5. 在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的
  6. 防止循环变量变成全局变量
  7. */
  8. /* -------防止循环变量变成全局变量--------- */
  9. for (var i = 0; i < 2; i++) {
  10. }
  11. console.log(i);
  12. for (let j = 0; j < 2; j++) {
  13. }
  14. console.log(j);
  15. </script>

 

  • 不存在变量提升 
  1. console.log(a); //a is not defined
  2. let a = 20;

 变量必须先声明再使用

  • 使用let声明的变量具有暂时性死区 
  1. var temp = 123;
  2. if(true) {
  3. temp = 'abc';
  4. let temp;
  5. }

在块级作用域中声明的变量就和这个块级作用域进行了绑定 ,不会受外部影响,所以if里面的temp和外面声明的temp毫无关系,在if语句里面先使用temp变量再声明会报错

一旦在块级作用域中声明一个变量,这个变量就会和这个作用域进行绑定,具有暂时性死区

 经典面试题(一)

  1. var arr = [];
  2. for(var i = 0; i < 2; i++) {
  3. arr[i] = function() {
  4. console.log(i);
  5. }
  6. }
  7. arr[0](); //2
  8. arr[1](); //2

 当i=0、1时进行循环,将两个函数赋值给数组的第0、1个值,注意,此时的函数没有调用,在整个for循环执行完成,也就是i=2不符合条件的时候,就会去调用两个函数,在函数的当前作用域中,是不存在i变量的,根据作用域链,会继续向上查找,于是去到全局作用域查找,i就是for循环中的计数器i,当前i=2,所以两个输出的都是2

注意:此题的关键点在于变量i是全局的,函数执行时输出的都是全局作用域下的i值

经典面试题(二)

  1. let arr = [];
  2. for(let i = 0; i < 2; i++) {
  3. arr[i] = function() {
  4. console.log(i);
  5. }
  6. }
  7. arr[0](); //0
  8. arr[1](); //1

let关键字有块级作用域, 两次循环都会产生块级作用域,里面各有一个i的值,这两个i值相互不影响,因为是不同的作用域,执行函数的时候,在当前块级作用域中没有i,根据作用域链,要继续向上查找,找到的是自己的上一级也就是循环产生的作用域里的i值

2.const 

作用:声明常量,常量就是值(内存地址)不能变化的量

使用const声明的常量具有以下特点:

  • 具有块级作用域
  1. if(true) {
  2. const a = 10;
  3. }
  4. console.log(a); //a is not defined

 

  1. <script type="text/javascript">
  2. if (true) {
  3. const a = 10;
  4. if (true) {
  5. const a = 100;
  6. console.log(a);
  7. }
  8. console.log(a);
  9. }
  10. console.log(a);
  11. </script>

  •  声明常量时必须赋值
const PI; //Missing initializer in const declaration
  •  常量赋值后,值不能修改(实质上是值对应的内存地址不可更改)

对于基本数据类型来讲,一旦赋值,值不可更改,比如数值、字符串类型的值

对于复杂数据类型来讲,不能重新赋值,但是可以更改数据结构内部的值,比如数组、对象

  1. const PI = 3.14;
  2. PI = 100; //Assignment to constant variable.
  1. const ary = [100,200];
  2. ary[0] = 'a';
  3. ary[1] = 'b';
  4. console.log(ary); //['a','b'];
  5. ary = ['a','b']; // Assignment to constant variable.
  1. const ary = [100, 200];
  2. ary[0] = 'a';
  3. console.log(ary);
  4. ary = [1, 2];

 let、const、var的区别

  1. 使用var声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象
  2. 使用let声明的变量,其作用域为该语句所在的代码块内,不存在变量提升
  3. 使用const声明的常量,在后面出现的代码中不能再修改该常量的值
varletconst
函数级作用域块级作用域块级作用域
变量提升不存在变量提升不存在变量提升
值可更改值可更改值不可更改

 什么时候使用const?定义了之后一般不改变的值,比如函数值,PI值,或者数学公式中不变的值

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/131173?site
推荐阅读
相关标签
  

闽ICP备14008679号