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 统一+性能高

 

posted @ 2018-06-02 16:44  丶七月小先生丶  阅读(254)  评论(0编辑  收藏  举报