前端发展趋势是什么?来点ES6的干货:箭头函数的this是静态的

150 阅读6分钟
  • 首先为啥要学习ES6?
  1. ES6 的版本变动内容最多,具有里程碑意义;
  2. ES6 加入许多新的语法特性,编程实现更简单、高效;
  3. ES6 是前端发展趋势,就业必备技能;

ECMASript 6 新特性

1.let 关键字

let 关键字用来声明变量,使用 let 声明的变量有几个特点:

  1. 不允许重复声明(let 只能声明一次 var 可以声明多次)
  2. 块儿级作用域(let 是在代码块内有效,var 是在全局范围内有效)
  3. 不存在变量提升(let 不存在变量提升,var 会变量提升)
  4. 不影响作用域链(什么是作用域链:很简单,就是代码块内有代码块,跟常规编程语言一样,上级代码块中的局部变量下级可用) 应用场景:以后声明变量使用 let 就对了

2.const 关键字

const 关键字用来声明常量,const 声明有以下特点:

  1. 声明必须赋初始值;
  2. 标识符一般为大写(习惯);
  3. 不允许重复声明;
  4. 值不允许修改;
  5. 块儿级作用域(局部变量); 注意: 对象属性修改和数组元素变化不会出发 const 错误

应用场景:声明对象类型使用 const,非对象类型声明选择 let;

3.解构赋值

ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构赋值。

应用场景:频繁使用对象方法、数组元素,就可以使用解构赋值形式

4.模板字符串

模板字符串是增强版的字符串,用反引号(`)标识

字符串中可以出现换行符;也可以使用 ${xxx} 形式引用变量;

//声明字符串的方法:单引号('')、双引号("")、反引号(``)
        let string = `我也一个字符串哦`;
        console.log(string);  
        
        // 2、可以使用 ${xxx} 形式引用变量
          let s = "大哥";
          let out = `${s}是我最大的榜样!`;
           console.log(out);

应用场景:当遇到字符串与变量拼接的情况使用模板字符串;

5.简化对象和函数写法

ES6 允许在大括号里面,直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁

            //声明变量
            let name = "叻叻白";
            let change = function() {
                console.log("改变自己");
            }
            //创建对象
            const school = {
                // 完整写法 
                // name:name, 
                // change:change 
                // 简化写法
                name,
                change,
                //声明方法的简化
                say() {
                    console.log("言行一致")
                }
            }
            school.change();
            school.say();

注意:对象简写形式简化了代码,所以以后用简写就对了

6.箭头函数

ES6 允许使用「箭头」(=>)定义函数,箭头函数提供了一种更加简洁的函数书写方式,箭头函数多用于匿名函数的定义

箭头函数的注意点:

  1. 如果形参只有一个,则小括号可以省略;
  2. 函数体如果只有一条语句,则花括号可以省略,函数的返回值为该条语句的执行结果;
  3. 箭头函数 this 指向声明时所在作用域下 this 的值;
  4. 箭头函数不能作为构造函数实例化;
  5. 不能使用 arguments; 特性:
  6. 箭头函数的this是静态的,始终指向函数声明时所在作用域下的this的值;
  7. 不能作为构造实例化对象;
  8. 不能使用 arguments 变量;
举例:
            //一.无参数的传统写法和ES6写法:
            var say = function() {
                console.log("hellow");
            }
            say();
             //ES6写法:
            let speak = () => console.log("hellow11");
            speak();

            //二.一个参数的传统写法和ES6写法:
            var hello = function(name) {
                return "hello" + name;
            }
            console.log(hello("叻叻白"));
            //ES6写法:
            let hi = name => "hi" + name;
            console.log(hi("叻叻白"));

            //三.多个参数的传统写法和ES6写法:
            var sum = function(a,b,c) {
                return a + b + c;
            }
            console.log(sum(1,2,3));
            //ES6写法:
            let ho = (a,b,c ) => a + b + c;
            console.log(ho(1,2,3));

微信截图_20220407134720.png 注意:箭头函数不会更改 this 指向,用来指定回调函数会非常合适

微信截图_20220407134720.png

7.rest参数

ES6 引入 rest 参数,用于获取函数的实参,用来代替 arguments

参考文章:www.jianshu.com/p/50bcb376a…

                // ES5获取实参的方式
                function data() {
                    console.log(arguments);
                }
                data("叻叻白","花花","不迟到");
         // ES6的rest参数...args,rest参数必须放在最后面
                function data(...args) {
                    console.log(args);
                }
                data("叻叻白","花花","不迟到");

8.扩展运算符

... 扩展运算符能将数组转换为逗号分隔的参数序列;扩展运算符(spread)也是三个点(...)它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列,对数组进行解包

               //声明一个数组 ...
               const front = ["叻叻白","花花"];
                // 声明一个函数
                function programmer() {
                    console.log(arguments);
                } 
                programmer(...front);

注意:rest 参数非常适合不定个数参数函数的场景

9.Symbol

ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。它是JavaScript 语言的第七种数据类型,是一种类似于字符串的数据类型。

参考文章:blog.csdn.net/fesfsefgs/a… Symbol 特点

  1. Symbol 的值是唯一的,用来解决命名冲突的问题
  2. Symbol 值不能与其他数据进行运算
  3. Symbol 定义的对象属性不能使用 for…in 循环遍历,但是可以使用 Reflect.ownKeys 来获取对象的所有键名 注意: 遇到唯一性的场景时要想到 Symbol

10.Symbol内置值

除了定义自己使用的 Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值,指向语言内部使用的方法。可以称这些方法为魔术方法,因为它们会在特定的场景下自动执行

微信截图_20220407134720.png 注意:Symbol内置值的使用,都是作为某个对象类型的属性去使用

11.迭代器

遍历器(Iterator)就是一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口,就可以完成遍历操作

特性: ES6 创造了一种新的遍历命令 for...of 循环,Iterator 接口主要供 for...of 消费;原生具备 iterator 接口的数据(可用 for of 遍历)

  1. Array;
  2. Arguments;
  3. Set;
  4. Map;
  5. String;
  6. TypedArray;
  7. NodeList; 工作原理:
  8. 创建一个指针对象,指向当前数据结构的起始位置;
  9. 第一次调用对象的 next 方法,指针自动指向数据结构的第一个成员;
  10. 接下来不断调用 next 方法,指针一直往后移动,直到指向最后一个成员;
  11. 每调用 next 方法返回一个包含 value 和 done 属性的对象; 注意:需要自定义遍历数据的时候,要想到迭代器;
         //声明一个数组
         const Journey = ['唐僧', '孙悟空', '猪八戒', '沙僧'];
         //使用for...of遍历数组
         for(let v of Journey) {
         console.log(v);
         }
         let iterator = Journey[Symbol.iterator]();
         //调用对象的next方法
         console.log(iterator.next());
         console.log(iterator.next());
         console.log(iterator.next());
         console.log(iterator.next());
         // 重新初始化对象,指针也会重新回到最前面
         let  iterator1 = Journey[Symbol.iterator]();
         console.log(iterator1.next());

微信截图_20220407134720.png