• es6 [记录]


    将a数组 与b数组进行合并
      a=[1,2,3]
      b=[4,5,6]

      c = a.concat(b);//c=[1,2,3,4,5,6]
    this.listArr.forEach((el, i) => {
        el.is_dafault = (el.id === obj.id) ? 0 : 1;
    })
    ECMA ≈ js
    ECMAScript = ECMA = ES
    
    兼容性
        ES5 很少不兼容
        ES6(ES2015):
            IE10+ 、 Google 、FireFox 、 移动端 、 NodeJs
            解决:编译 、转换
    
    转换:
        1.在线转换
        2.提前编译(!提倡,在线转换费时间) 
    
        在线转换:
        babel == browser.js
        使用方式:引入browser.js+script标签(代码范围)定义type=“text/babel”
        编译需要时间
    
    ES6
    1. 变量
        let(变量,可以不断修改) / const(常量,不能修改) 不能重复声明
        块级作用域 { ... }
            div > input*3 click=function alert(i)
            解决1 for里面垫了一层作用域(function(i)){a.onclik=fn})(i);
            解决2 for(let i=0 ...)
    
    2. 函数
        箭头函数
        function name(){}  ()=>{}    function去掉加=>
        1.如果只有一个参数 ()可以省 a=>{...}
        2.如果只有一个return {}可以省 a=>a*2;
    
        函数的参数
        1.参数扩展+数组展开(剩余参数)
            function(a,b,...args){  //args  可以随便取名字
                // a,b,...args,c  [X]
                alert(a);
                alert(b);
                alert(args);
            }
            show(12,15,8,9,20);
            +收集剩余参数
                *Rest Parameter必须是最后一个
            +展开一个数组
                let arr = [1,2,3];
                ...arr  相当于  1,2,3
                展开后的效果,跟直接把数组的内容写出来一样
                let arr = [...arr1,...arr2]
            不符合语法情况(以下赋值)
                let a;
                let arr = [1,2,3]
                a = ...arr; [X]   // a = 1,2,3;
                alert(a);
        2.默认参数
            如:animation 里面的时间
            function show(a,b=5,c=12){
                console.log(a,b,c)
            }
            show(99,19)    ---  99,19,12
        
    3. 数组
       + map 映射  =>  一个对一个
               [12,58,86,45,91]   =>   [不及格,不及格,及格,不及格,及格]
               [12,58,86,45,91]   =>   [{...},{...},{...},{...},{...}]
    
               let arr=[12,5,8]
               arr.map(function(item){
                   alert(item*2)
               })
               arr.map(item=>item*2)
       + reduce 汇总  =>  一堆出来一个
               算个总数 平均数 ...
               [1,2,3] => 6
    
               let arr =[12,69,180,8763]
               arr.reduce(function(tmp他是中间结果 临时结果用于下一次,item,index){
                   return tmp+item
               })
               中间结果 return 0+12  ->  return 12+69 ->  return 81+180 ...
    
               平均数
               求和+最后一次单独处理if(index != arr.length-1+ filter 过滤器  留一部分删一部分
               let arr = [12,5,8,99,27,36,75] 能被3整除的留下
               let res = arr.filter(item=>item%3==0)
    
       + forEach 循环(迭代)
               arr.forEach(el=>{...})
               arr.forEach((el,index)=>{...})
    
    4. 字符串
        1.多两个新方法
            startsWith
                str.startsWith('a') 字符串是否以a开头  
                https:// 
            endsWith
                str.endsWith('.com')
                163.com
        2.字符串模板
            反单引号 1边上 
            let a = 12;
            `uuu${a}`  ==> uuu12   把变量放到字符串
            拼接html
    
            普通字符串不能折行,模板字符串能折行
            let str='<div>
                <h3>'+h3+'</h3>
                <p>'+p+'</p>
                </div>';
    
    5. 面向对象
        + 面向对象
        function User(name,pass){
            this.name=name;
            this.pass=pass;
        }
        User.prototype.showName=function(){alert(this.name);}
        User.prototype.showPass=function(){alert(this.pass);}
        var  u1 = new User('n1','123456');
        alert(u1.showName);
        alert(u1.showPass);
        类和构造函数一样+散开
    
        新版面向对象
        class User{
            constructor(name,pass){
                this.name=name;
                this.pass=pass;
            }
            showName(){alert(this.name);}
            showPass(){alert(this.pass);}
        }
        1.class关键字、构造器和类分开
        2.class里面直接加方法
    
        + 继承:
        function VipUser(name,pass,level){
            User.call(this,name,pass);
            this.level = level;
        }
        VipUser.prototype=new User();
        VipUser.prototype.constructor=VipUser;
        VipUser.prototype.showLevel=function(){alert(this.level);}
    
        新版本继承
        class VipUser extends User{  继承自User
            constructor(name,pass,level){
                super(name,pass);               ------  super 超类=父类   call
                this.level = level;
            }
            showLevel(){alert(this.level);}
        }
    
        + 面向对象实例 (应用--react)
            react:组件化-class + JSX(JSX==babel==browser.js  react依赖于JSX JSX是js扩展版)
            react.js + react-dom.js + browser.js
            script type='text/babel'
            class 新组件Name extends React.Component{
                constructor(...args){
                    super(...args);
                }
                render(){
                    return <span>{this.props.str}</span>;
                    也可以return 组件 <新组件Name str='我想传参'></新组件Name>
                }
            }
            window.onload=function(){
                ReactDom.render(
                    <新组件Name str='我想传参'></新组件Name>,
                    ......
                )
            }
    
    
    6. Promise  -- 承诺
        异步:操作和操作之间没有关系 可以同时进行多个操作
            缺:代码更复杂
                ajax('/banners',function(){
                    继续往下ajax 请求别的 一层层往下走
                },function(){
                    alert('get Error')
                })
        同步:同时只能做一件事
            代码简单
                顺序往下写ajx代码即可
    
        Promise -- 清除异步操作
            * 用同步一样的方法 来书写异步代码
            需要Promise 需要new
            let p = new Promise(function(resolve解决,reject拒绝){
                // 异步代码
                // resolve -- 成功了
                // reject -- 失败了
                $.ajax({
                    url:'arr.txt',
                    dataType:'json',
                    sucess(arr){
                        // 成功的时候调用 resolve
                        resolve(arr);
                    },
                    error(err){
                        // 失败的时候调用 reject
                        reject(err);
                    }
                })
            })
            应用
            p.then(function(arr){
                // 成功调用的方法
            },function(err){
                // 失败调用方法
            })
    
            // 应用到点
            let p1 = ......  arr
            let p2 = ......  json
            Promise.all([p1,p2]).then(function(arr){
                alert('全都成功')
                cosnole.log  --- arr = [ arr , json ]
                分解
                let [res1,res2] = arr
    
            },function(){
                alert('至少有一个失败了')
            })
            写两个Promise 麻烦 =>  封装
            function createPromise(url){
                return new Promise(function(resolve,reject){
                    $.ajax({
                        url,
                        dataType:'json',
                        sucess(arr){resolve(arr);},
                        error(err){reject(err);}
                    })
                })
            }
            Promise.all([createPromise(url1),createPromise(url2)]).then(........)
    
            高版本jq 自带 Promise  不用自己封装
            Promise.all([
                $.ajax({url:'url1',dataType:'json'}),
                $.ajax({url:'url2',dataType:'json'})
            ]).then(res=>{
                let [arr,json] = res;
            },err=>{})
    
            *其他用法   
            Promise.race  竞速   用的少
            all 一个个都要成功 一个不能缺一个不能少
            race 需求 谁先来执行谁
            Promise.race([
                $.ajax({url:'url1',dataType:'json'}),
                $.ajax({url:'url2',dataType:'json'})
            ])
    
    7. generator - 生成器
        generat - 生成
    
        普通函数 -- 一条路走到底
        + generator函数 -- 中间能暂停
        function *show(){   *爱贴着谁贴着谁 但是不能一起贴
            alert('a');
            和*配    yield;  暂时放弃执行
            alert('b');
        }
        不能直接show();  创建出了generator对象 踹一脚走一步
            - let genObj=show();
            - genObj.next();     a
            - genObj.next();     b
        为什么要停?
            function 函数(){
                代码...
                ajax(xxx,function(){
                    代码...
                });
            }
            相当于  不用回调
            function *函数(){
                代码...
    
                yield ajax(xxx);// 这里配置
    
                代码...
            }
    
        + yield 既可以传参 又可以返回
            ++ 传参
            function *show(){
                alert('a');
                yield;         let a = yield;
                alert('b');
                               alert(a)  a=5
            }
            let genObj=show();
            genObj.next(12);
            genObj.next(5);
            next里面可以传参 传参的参数会到yield里面
            yield 里面接参数 let a = yield;
            a=5 解释:
                第一个next 执行开始到yeild   let a = 不包括
                第二个next 从 let a = 开始   5从这时候进去
                第一个next 传参是废的
            
            ++ 返回    中间结果 (每一步都有一个中间结果)  +  最后结果(return)
                yield后面可以跟东西
                function *show(){
                    alert('a');
                    yield 12;
                    alert('b');
                }
                let gen=show();
                let res1 = gen.next();
                console.log(res1);
                     ---  {value:12,done:false}
                          done  还未完成
                let res2 = gen.next();
                console.log(res2)
                     ---  {value:undefined,done:true}
                          执行最后一个了undefined  = return的东西
                function *炒菜(菜市场买回来的菜){
                    洗菜 --> 洗好的菜
    
                    let 干净的菜 = yield 洗好的菜;
    
                    干净的菜 --> 切 --> 丝
    
                    let 切好的菜 = yield 丝;
    
                    切好的菜  --> 炒   -->  熟的菜
    
                    return 熟的菜;                
                }
                开始到  yield 右边  ---  一个程序
            
        + generator 实例 Runner
            需要组件支持 cnpm i yield-runner-blue   主要要js index.js
            runner.js + runner.js
            runner(function *(){
                let data1 = yield $.ajax({url:'url1',dataType:'json'});
                let data2 = yield $.ajax({url:'url2',dataType:'json'});
                let data3 = yield $.ajax({url:'url3',dataType:'json'});
                console.log(data1,data2,data3)
            })
            可以像写同步一样写异步
            $.ajax({url:'url1',dataType:'json'});-Promise对象   yield出去 给runner
    
            异步操作:
            1.回调
                $.ajax(.....sucess($.ajax(.....sucess(......))))
            2.Promise
                Promise.all([$.ajax,$.ajax]).then(......)
            3.generator
                runner(function *(){
                    let d1 = yield $.ajax(....); * n
                })
    
            ++ 带逻辑处理  用户-vip------
                Promise.all([$.ajax]).then(res=>{
                    if(xxx == 'vip'){
                        Promise.all......
                    }else{
                        ........
                    }
                },......)
                比普通回调还麻烦  
    
                generator (generator函数不能写成箭头函数)
                runner(function *(){
                    let u = yield $.ajax(....);
                    if(u=='vip'){
                        let u2 =  yield $.ajax(....);
                    }else{
                        let u2 =  yield $.ajax(....);
                    }
                })
    
                Promise - 适合 一次读一堆 没有什么逻辑
                generator - 逻辑性比较强   (他的本质就是Promise)
    
        + generator 实例 KOA(NodeJs框架)
            KOA里面如何用generator
            cnpm i koa
            cnpm i koa-mygsql
            const koa = require(koa)
            const koa = require(koa-mygsql)
            let db = mygsql.createPool...........
            let server = new koa();
            server.user(function *(){
                这里就是generator
                let data = yield db.query(....................)
                db 就是个异步
                this.body = data;
            })
            server.listen(8080)
    
    
    
    8. 模块化
    
    变量:
        var 可以重复声明   作用域为函数级
        无法限制修改  常量π PI
        没有块级作用域
    
    解构赋值:
        1.左右两边的解构必须一样
        2.右边 必须是个东西
        3.声明和赋值不能分开(必须在一句话中完成)
    
        + 
            let [a,b,c] = [1,2,3]
            相当于  let a = 1; .......
            let {a,b,c} = {a:1,b:2,c:3}
    
        +
            注意 
                [...] = {...}   [X]
                {a,b} = {12,5}  [X]
                let [a,b]; [a,b]=[2,5]   [X]
    
    
    JSON
        1.json对象
            let json={a:12,b:5};
            let str='http://apiUrl........?data='+encodeURLComponent(JSON.stringify(json))
            JSON.stringify
    
            let str="{a:12,b:5}"
            let json = JSON.parse(str);
            标准写法:
                1.只能用双引号 不能用单引号
                2.所有名字都必须用双引号包起来
            {"a":12,"b":56}
    
        2.简写
            名字一样
                let a = 5;
                let json = {a:a,b:15}    ==> json = {a,b:15}
                名字和值一样 key = value
            方法
                let json = {
                    a: 12,
                    // show:function(){
                    //     alert(this.a);
                    // }
                    show(){......}
                }
                :function 一块删
    ES7预览
    Google 59+
    
    1.数组
        includes 数组里面是否包含某个东西
            arr.includes(99);
        keys/values/entries
            for...of
                循环迭代器
                for(let i in arr)  i为值=value
                for(let i in json)  i 报错
                    json对象是一个可迭代的对象,不是一个迭代器
                    for...of不能用于json
            for...in
                循环json
                for(let i in arr)   i为下标=key
                for(let i in json)  i=key
    
    
            for...of
                keys=>所有的key拿出来 0,1,2,3
                values=>所有的value拿出来  12,5,99
                entries=>所有的key-value对拿出来  {key:0,value:12},{key:1,value:5}......
                    * entry实体
                for(let key of arr.keys()){......}
                for(let val of arr.values()){......}    !!!ES7
                for(let entry of arr.entries()){......}
                 = for(let [key,value] of arr.entries()){......}
    
    2.幂
        求幂    之前:Math.pow(3,8)
            3**8
    
    3.字符串padStart/padEnd
        console.log('abc'.padStart(10))  从起始位置补10个 
        end 往后补
        第二个参数console.log('abc'.padStart(10,'0'))  不补空格 补0 时钟09
    
    4.语法容忍度
        + 数组容忍度
            [1,2,3]   => [1,2,3,]
            ie----  [1,2,3,] 直接不认
        + 参数容忍度
            function aa(1,2,3,) {}
    
    5.async await !!!要求浏览器版本59+++
        async await => generator yield 的取代
        generator 需要runner
        async function show(){alert('a');await;alert('b');}
        async function readData(){
            let d1 = await $.ajax(......)
            ............
        }
        1.async可以写成箭头函数  let read = async ()=>{......}
        2.不依赖于外部的runner 统一+性能高
  • 相关阅读:
    判断当前是否运行于Design Mode
    从Setting.settings到Resource.resx
    构造函数强制使用new
    getFullYear 方法
    前端开发中经常使用到的20个正则表达式。
    函数调用模式
    javascript中return的作用
    javascript数组遍历for与for in区别详解
    闭包
    js split 的用法和定义 js split分割字符串成数组的实例代码
  • 原文地址:https://www.cnblogs.com/caiCheryl/p/9125825.html
Copyright © 2020-2023  润新知