Structure-study-es6(ESModel、compose、reduce)

355 阅读2分钟

ESModule

es6是静态导入 主要使用import 和 export

  • import语法会解析到页面的最顶端
  • 每次获取的值都会随着接口中的内容变化而变化
    // a.js
    let a = 1; // 导出a变量 (接口)
    let b = 2;
    let h = 'hello'
    setInterval(()=>{
        a++
    },1000)
    export { //不能写成对象格式
        a as c, // as 就是起别名
        b,
        h as default // export default h
    }
    // export default c;

    // index.js
    setInterval(() => {
        console.log(c,b); // 每次c的值都会发生变化
    }, 1000);
    import _,{c,b} from './a';
    import * as obj from './a';  // 可以将所有属性收集到obj对象中

    import './a' // 有副作用的导入 可以让文件执行 当时没有使用这个文件中的内容
  • 动态导入 可以在作用域中使用
    let btn = document.createElement('button');
    btn.addEventListener('click',function(){
        // import语法返回的是一个promise
        import('./file').then(data=>{
            console.log(data);
        });// 动态的使用jsonp加载一个新的文件
    })
    document.body.appendChild(btn);

promise

1、中断promise链 就是返回一个等待的promise

    let p1 = p.then(()=>{
        console.log('ok');
        return new Promise(()=>{})
    }).then(()=>{
        console.log(1);
    })

2、如何放弃某个promise的执行结果

function wrap(p1){
    let fail = null;
    let p2 = new Promise((resolve,reject)=>{
        fail = reject; // 先将p2失败的方法暴露出来 
    });
    let p = Promise.race([p2,p1]); // race方法返回的也是一个promise
    p.abort = fail;
    return p
    
}
let p = wrap(new Promise((resolve,reject)=>{
    setTimeout(() => {
        resolve('ok');
    }, 3000);
}))
p.abort('error');
p.then(data=>{
    console.log(data);
}).catch(err=>{
    console.log(err);
});  

箭头函数

没有 this arguments prototype(不能实例化)

   let a = 100; // 此属性不会放到全局上
    let obj = {
        a:1,
        fn:()=>{ // this => obj 没有this指向从而解决了this问题
            setTimeout(()=>{ 
                console.log(this.a);
            })
        }
    }
    obj.fn();  // undefined

数组新方法

filter map find findIndex some every reduce

1、reduce 收敛

    let total = [{price:10,count:5},{price:10,count:5},{price:10,count:5}].reduce((prev,current,index,arr)=>{
        return prev + current.price * current.count
    },0);

2、reduce收敛实现扁平化flat

    const flatten = arr => arr.reduce((item, next) => item.concat(Array.isArray(next) ? flatten(next) : next), []);

3、compose函数

    // reduceRight
    function compose(...args){
        return function(...values){
            let fn = args.pop(); // 先取出最后一项
            return args.reduceRight((prev,current)=>{
                return current(prev) // 把上一次计算的结果传递给下一个函数
            },fn(...values))
        }
    }

    // reduce
    function compose(...args){
        return args.reduce((prev,current)=>{
            return function(...values){
                return prev(current(...values))
        }
    })
    
    // 应用
    function sum(a,b){
        return a+b;
    }
    function len(str){
        return str.length;
    }
    function addCurrency(val){
        return '¥'+ val
    }
    
    let r = compose(addCurrency,len,sum)('abc','bed');
    
    // 执行过程
    /*
        prev = addCurrency
        current = len
        
        prev = function(...values){
            return addCurrency(len(...values))
        }
        current = sum;
        
        returnValue = function(...values){
            return addCurrency(len(sum(...values)))
        }
    */
}