前端ES6技术使用汇总

Posted mask哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前端ES6技术使用汇总相关的知识,希望对你有一定的参考价值。

1.webpack
   webpack 是javascript应用程序的静态模块打包器。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图 (dependency graph) ,其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。

   webpack核心概念:
        入口 (entry):入口会指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始.

        输出 (output):output 属性会告诉 webpack 在哪里输出它创建的 bundles ,以及如何命名这些文件,默认值为 ./dist:
         const config =
              entry: "./src/main.js",
              output:
                filename: "bundle.js",
                path: path.resolve(__dirname, 'dist')
              
            

        loader:loader 让 webpack 可以去处理那些非 JavaScript 文件( webpack 自身只理解 JavaScript ).被用于转换某些类型的模块.
              
            const config =
              entry: "./src/main.js",
              output:
                filename: "bundle.js",
                path: path.resolve(__dirname, 'dist')
              ,
              module:
                rules: [
                  
                      test: /\\.js$/,
                      exclude: /node_modules/,
                      loader: "babel-loader",
                      options: [
                        presets: ["env"]
                      ]
                  
                ]
              
            

        插件 (plugins):插件则可以处理包括打包优化、压缩、定义环境变量等。使用一个插件只要 require() ,然后添加到 plugins 数组中。

        // 通过 npm 安装
            const htmlWebpackPlugin = require('html-webpack-plugin');
            // 用于访问内置插件 
            const webpack = require('webpack'); 
             
            const config =
              module:
                rules: [
                  
                      test: /\\.js$/,
                      exclude: /node_modules/,
                      loader: "babel-loader"
                  
                ]
              ,
              plugins: [
                new HtmlWebpackPlugin(template: './src/index.html')
              ]
            ;


         利用 webpack 搭建应用(webpack.config.js):
            const path = require('path');
 
            module.exports =
              mode: "development", // "production" | "development"
              // 选择 development 为开发模式, production 为生产模式
              entry: "./src/main.js",
              output:
                filename: "bundle.js",
                path: path.resolve(__dirname, 'dist')
              ,
              module:
                rules: [
                  
                    test: /\\.js$/,
                    exclude: /node_modules/,
                    loader: "babel-loader",
                    options: [
                      presets: ["env"]
                    ]
                  
                ]
              ,
              plugins: [
                ...
              ]
            
2.es6中js新增关键字:
     let声明的变量只在let 命令所在的代码块内有效。

     const声明一个只读的常量,一旦声明,常量的值就不能改变。

3.赋值解析

4.Symbol:es6一种新的原始数据类型,表示独一无二的值。最大的用法是用来定义对象的唯一属性名。ES6数据类型:Number 、 String 、 Boolean 、 Object、 null 和 undefined ,新增Symbol ;

  用法:Symbol 函数栈不能用 new 命令,因为 Symbol 是原始数据类型。可以接受一个字符串作为参数,为新创建的 Symbol 提供描述,用来显示在控制台或者作为字符串的时候使用。

    let sy=Symbol("kk");
    console.log(sy);
    typeof(sy);//类型为:symbol

    // 相同参数 Symbol() 返回的值不相等,因为引用空间不同
     let sy1 = Symbol("kk"); 
     sy === sy1;       // false


5.Map与set
  Map 对象保存键值对.


     map迭代方式:for... of 与forEach()

     map与数组转换:
         var kvArray = [["key1", "value1"], ["key2", "value2"]];
         
        // Map 构造函数可以将一个 二维 键值对数组转换成一个 Map 对象
        var myMap = new Map(kvArray);
         
        // 使用 Array.from 函数可以将一个 Map 对象转换成一个二维键值对数组
        var outArray = Array.from(myMap)


       //Map -> key 是函数
        var myMap=new Map();
        var keyFunc=function();//函数
        myMap.set(keyFunc,"和键 keyFunc关联的值");

        myMap.get(keyFunc);
        myMap.get(function()); undefined, 因为 keyFunc !== function ()

        //Map的迭代
        //1. for...of

        var myMap1=new Map();
        myMap1.set(0,"zero");
        myMap1.set(1,"one");
        for(var [key,value] of myMap1)
         console.log(key+" = " +value);
        

        for(var [key,value]of myMap1.entries())
            console.log(key +" = "+value);
        

        for(var key of myMap1.keys())
            console.log(key);
        
        for (var value of myMap1.values())
            console.log(value);
          

          //2. forEach()
          var myMap2=new Map();
          myMap2.set(0,"zero");
          myMap2.set(1,"one");

          myMap2.forEach(function(v,k)
              console.log(k+" = "+v);

          ,myMap2);

          //3.map与arry的转换

          var kvArray=[["k1","v1"],["k2","v2"]];
          // Map 构造函数可以将一个 二维 键值对数组转换成一个 Map 对象
          var mnyMap=new Map(kvArray);
          console.log(mnyMap);

          //4. 使用 Array.from 函数可以将一个 Map 对象转换成一个二维键值对数组
          var outArray=Array.from(mnyMap);
          console.log(outArray);

          //5.Map 的合并
          var first=new Map([[1,'one'],[2,'two'],[3,'three'],]);
          var second=new Map([[1,'uno'],[2,'dos']]);
          // 合并两个 Map 对象时,如果有重复的键,则后面的会覆盖前面的,对应值即 uno,dos, three
          var merge=new Map([...first,...second]);
          console.log(merge);

  Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用
      Set 中的特殊值
            Set 对象存储的值总是唯一的,所以需要判断两个值是否恒等。有几个特殊值需要特殊对待:
            +0 与 -0 在存储判断唯一性的时候是恒等的,所以不重复;
            undefined 与 undefined 是恒等的,所以不重复;
            NaN 与 NaN 是不恒等的,但是在 Set 中只能存一个,不重复。
    set作用:1.数组去重;2.并集 3.交集 4.差集


          //set不允许重复值
          let mySet=new Set();
          mySet.add(1);
          mySet.add(5);
          mySet.add(5);
          var o=a:1,b:2;
          mySet.add(o);
          console.log(mySet);
          //类型转换 Array
          var myset1=new Set(["v1","v2","v3"]);
          // 用...操作符,将 Set 转 Array
          var myArray=[...myset1];
          console.log(myArray);
        // String 转 Set
        var mySet2=new Set('hello');
        console.log(mySet2);// 注:Set 中 toString 方法是不能将 Set 转换成 String

        //数组去重
        var mSet=new Set([1,2,3,4,4]);
        console.log([...mSet]);
        //并集
        var a = new Set([1, 2, 3]);
        var b = new Set([4, 3, 2]);
        var union=new Set([...a,...b]);
        console.log(union);

        //交集
        var a1 = new Set([1, 2, 3]);
        var b1 = new Set([4, 3, 2]);
        var intersect=new Set([...a].filter(x=>b.has(x)));
        console.log(intersect);

        //差集
        var a = new Set([1, 2, 3]);
        var b = new Set([4, 3, 2]);
        var diff=new Set([...a].filter(x=>!b.has(x)));
        console.log(diff);


6.Reflect 与 Proxy:是ES6操作对象引入的api
   Proxy 可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式,通过对象的代理对象进行操作,在进行这些操作时,可以添加一些需要的额外操作。

   Reflect 可以用于获取目标对象的行为,它与 Object 类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与 Proxy 是对应的。

   Proxy用法由target和handler组成

    let target=
    name:'tom',
    age:24
    

    let handler=
        get:function(target,key)
            console.log('getting',+key);
            return target[key];
        ,
        set:function(target,key,value)
            console.log('setting '+key);
            target[key]=value;
        
    

    let proxy=new Proxy(target,handler);
    console.log(proxy.name);
    proxy.age=25;
    proxy.name='tim';
    console.log("name="+proxy.name+",age="+proxy.age);

7.数组:
        //1.数组创建:
        //1.1 Array.of()   
        console.log(Array.of(1,2,3,3))
        console.log(Array.of(1, '2', true)); // [1, '2', true]
        // 参数为空时返回空数组
        console.log(Array.of()); // []

        //1.2 Array.from()
        console.log(Array.from([1, 2]));

        //map 函数,用于对每个元素进行处理,放入数组的是处理后的元素。
        console.log(Array.from([1,2,3],(n)=>n*2));

        //转换map
        let map=new Map();
        map.set('ky1','v0');
        map.set('k2','v2');
        console.log(Array.from(map));

        //转换 set

        let arr=[1,2,3];
        let set=new Set(arr);
        console.log(Array.from(set));

        //转换字符串
        let str='abc';
        console.log(Array.from(str));

        //查找数组中符合条件的元素,若有多个符合条件的元素,则返回第一个元素。 find()
        let arr2 = Array.of(1, 2, 3, 4);
        console.log(arr.find(item => item > 2)); 

        //查找数组中符合条件的元素索引,若有多个符合条件的元素,则返回第一个元素索引。findIndex()
        let arr3 = Array.of(1, 2, 1, 3);
        // 参数1:回调函数
        // 参数2(可选):指定回调函数中的 this 值
        console.log(arr.findIndex(item => item == 2)); // 1
         
        // 数组空位处理为 undefined
        console.log([, 1].findIndex(n => true)); //0

        //遍历键值对: entries()
        for(let[key,value] of ['a','b'].entries())
            console.log(key,value);
        
        //不使用for...of 循环
        let entries=['a','b'].entries();
        console.log(entries.next().value);
        console.log(entries.next().value);

        //遍历key: keys()
        for(let key of ['a', 'b'].keys())
            console.log(key);
        

        //遍历键值:values()
        for(let value of ['a', 'b'].values())
            console.log(value);
        

8.函数
9.es6模块化
 在 ES6 前, 实现模块化使用的是 RequireJS 或者 seaJS(分别是基于 AMD 规范的模块化库,  和基于 CMD 规范的模块化库)。
 ES6 引入了模块化,其设计思想是在编译时就能确定模块的依赖关系,以及输入和输出的变量。
 ES6 的模块化分为导出(export) @与导入(import)两个模块。

     export 与 import 
     基本用法:模块导入导出各种类型的变量,如字符串,数值,函数,类。

    导出的函数声明与类声明必须要有名称(export default 命令另外考虑)。 
    不仅能导出声明还能导出引用(例如函数)。
    export 命令可以出现在模块的任何位置,但必需处于模块顶层。
    import 命令会提升到整个模块的头部,首先执行。


  ***建议使用大括号指定所要输出的一组变量写在文档尾部,明确导出的接口。***

    export default 命令:
        在一个文件或模块中,export、import 可以有多个,export default 仅有一个。
        export default 中的 default 是对应的导出接口变量。
        通过 export 方式导出,在导入时要加 ,export default 则不需要。
        export default 向外暴露的成员,可以使用任意变量来接收。

10.Promise对象:是异步编程的一种解决方案;从它可以获取异步操作的消息;
       Promise 异步操作有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败);

                 状态的缺点:
                    无法取消 Promise ,一旦新建它就会立即执行,无法中途取消。

                    如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。

                    当处于 pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
     then 方法:then 方法接收两个函数作为参数,第一个参数是 Promise 执行成功时的回调,第二个参数是 Promise 执行失败时的回调,两个函数只会有一个被调用。
          then 方法的特点:在 JavaScript 事件队列的当前运行完成之前,回调函数永远不会被调用。通过 .then 形式添加的回调函数,不论什么时候,都会被调用。
          const p = new Promise(function(resolve,reject)
              resolve('success');
            );
             
            p.then(function(value)
              console.log(value);
            );
             
            console.log('first');

        function testAwait()
            return new Promise((resolve)=>
                setTimeout(function()
                    console.log("testAwait");
                    resolve();
                ,1000);
            );
        

        async function helloAsync()
            await testAwait();
            console.log("helloAsync");
        


        console.log(helloAsync());

        // helloAsync().then(v=>
        //     console.log(v);
        // );

11.Generator 函数:通过 yield 关键字,把函数的执行流挂起,为改变执行流程提供了可能,从而为异步编程提供解决方案。
    Generator 函数组成:
     在 function 后面,函数名之前有个 * ;函数内部有 yield 表达式。

     function* func()
         console.log("one");
         yield '1';
         console.log("two");
         yield '2'; 
         console.log("three");
         return '3';
    
    
    执行机制:Generator 函数不会像普通函数一样立即执行,而是返回一个指向内部状态对象的指针,所以要调用遍历器对象Iterator 的 next 方法,指针就会从函数头部或者上一次停下来的地方开始执行。
    f.next();

12.async:是 ES7 才有的与异步操作有关的关键字,和 Promise , Generator 有很大关联. 
          async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数;
          await 关键字仅在 async function 中有效,用于等待一个 Promise 对象;
          async 函数执行时,如果遇到 await 就会先暂停执行 ,等到触发的异步操作完成后,恢复 async 函数的执行并返回解析值。

      async function helloAsync()
           return "helloAsync";
        
          
        console.log(helloAsync())  // Promise <resolved>: "helloAsync"
         
        helloAsync().then(v=>
           console.log(v);         // helloAsync
        )


       function testAwait()
           return new Promise((resolve) =>
               setTimeout(function()
                  console.log("testAwait");
                  resolve();
               , 1000);
           );
        
         
        async function helloAsync()
           await testAwait();
           console.log("helloAsync");
        
        helloAsync();

以上是关于前端ES6技术使用汇总的主要内容,如果未能解决你的问题,请参考以下文章

web前端技巧-ES6新特性与重点知识汇总

ES6 常用总结(前端开发js技术进阶提升总结)

前端面试高频考点,ES6知识点汇总!!!

web前端技巧-ES6新特性与重点知识汇总

前端常见知识点汇总(ES6,Vue,axios,Node.js,npm,webpack)

90% 前端都会的 ES6 简化代码技巧,你用过哪些?