美文网首页
ES6 面向对象 promise

ES6 面向对象 promise

作者: 北京大土豆 | 来源:发表于2018-10-13 22:31 被阅读0次

    1. 变量/赋值

    • var 可以重复定义、不能限制修改、没有块级作用域

    • let 不能重复定义, 变量,块级作用域

    • const 不能重复定义, 常量,块级作用域

    • 结构赋值

      • 数组解构赋值
      • 对象解构赋值

    2. 函数

    • 箭头函数
     function(参数,参数){
      //  函数体
    }
    (参数, 参数)=>{
      // 函数体
    }
    
      let arr=[12,5,88,34,32,19];
    
      /*arr.sort(function (n1, n2){
        return n1-n2;
      });*/
      arr.sort((n1, n2)=>{
        return n1-n2;
      });
    
      alert(arr);// 5,12,19,32,34,88
      // 1.有且仅有1个参数,()可以省去
      arr.sort((n1, n2)=>n1-n2);
      // 2.如果函数体只有一句话,而且是return,{}可以省
      /*let show=function (a){
            return a*3;
          };*/
          let show=a=>a*3;
    
          alert(show(13));
    
    

    注意
    箭头函数有几个使用注意点。

    (1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。

    (2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。

    (3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。

    (4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。

    上面四点中,第一点尤其值得注意。this对象的指向是可变的,但是在箭头函数中,它是固定的。

    • 函数参数的默认参数
      /*function show(a, b, c){
          b=b||5;
          c=c||12;
    
          console.log(a,b,c);
        }*/
      let show=(a, b=37, c=12)=>{
          console.log(a,b,c);
        }
    
      show(12, 37);// 12 37 12
    
    • 参数展开(剩余参数, 数组展开)
    1. '...'的第一个用途: 接收剩余参数
      function show(a, b, ...名字)剩余参数必须在参数列表的最后
    2. '...'的第二个用途:展开一个数组
     let show=(a, b, ...args) =>{
          console.log(a, b, args);
        }
        show(1,2,3,4,5,6,7,8) // 1 2  [3, 4, 5, 6, 7, 8]
    
     let arr = [1,2,3];
        arr.push(4,5,6);
        // alert(arr) // 1,2,3,4,5,6
        let arr1 = [1,2,3];
        let arr2 = [4,5,6];
        arr1.push(...arr2)
        alert(arr1) // 1,2,3,4,5,6
    
    
         function show1(...args){
          show2(...args);
        }
    
        function show2(a, b){
          alert(a+','+b);
        }
    
        show1(12, 5);
    
    • rest 参数

    rest 参数(形式为...变量名)
    获取函数的多余参数,这样就不需要使用arguments对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。

      // arguments变量的写法
      function sortNumbers() {
        return Array.prototype.slice.call(arguments).sort();
      }
    
      // rest参数的写法
      const sortNumbers = (...numbers) => numbers.sort();
      // arguments对象不是数组,而是一个类似数组的对象。所以为了使用数组的方法,必须使用Array.prototype.slice.call先将其转为数组。
      // rest 参数就不存在这个问题,它就是一个真正的数组,数组特有的方法都可以使用。下面是一个利用 rest 参数改写数组push方法的例子。
    
      function push(array, ...items) {
          items.forEach(function(item) {
            array.push(item);
            console.log(item);
          });
        }
    
        var a = [];
        push(a, 1, 2, 3)  
    

    3.数组/json

    数组--5种

    • map 映射: 一个对一个
    • filter 过滤
    • forEach 遍历
    • reduce 汇总
    • Array.from([array-like])=>[x,x,x]

      let aDiv=document.getElementsByTagName('div')获取到的一个是一个array-like,可以使用from()方法转为Array
      map

        let arr=[62, 55, 82, 37, 26];
    
        /*let arr2=arr.map(function (item){
          if(item>=60){
            return true;
          }else{
            return false;
          }
        });*/
        /*
        let arr2=arr.map(item=>{
            if(item>=60){
              return true;
            }else{
              return false;
            }
          });*/
    
        let arr2=arr.map(item=>item>=60);
        alert(arr2); //true,false,true,false,false
    

    filter

      let arr=[12,5,88,37,21,91,17,24];
    
        let arr2=arr.filter(item=>item%2);
    
        alert(arr2);
    
       let arr=[12,5,88,37,21,91,17,24];
    
        let sum=0;
        arr.forEach(item=>{
          sum+=item;
        });
    
        alert(sum);
    

    reduce

    // 计算arr数组的和
        let arr=[12,5,88,37,21,91,17,24];
    
        let sum=arr.reduce((tmp,item,index)=>{
          console.log(tmp, item, index);
    
          return tmp+item;
        });
    
        console.log(sum);
        // 计算arr数组的平均值
        let ave=arr.reduce((tmp,item,index)=>{
          if(index<arr.length-1){
            return tmp+item;
          }else{    //最后一次迭代
            return (tmp+item)/arr.length;
          }
        });
        console.log(ave);
    
    

    Array.from([array-like])=>[x,x,x]

        <!-- 用js改变div的北背景色 -->
      <style>
            div {width:200px; height:200px; background:#CCC; float:left; margin:10px;}
          </style>
          <script>
          window.onload=function (){
            let aDiv=document.getElementsByTagName('div');
            console.log(aDiv)
            Array.from(aDiv).forEach(div=>{
              div.style.background='yellow';
            });
          };
          </script>
        <body>
          <div class=""></div>
          <div class=""></div>
          <div class=""></div>
          <div class=""></div>
          <div class=""></div>
        </body>
    

    json的两个变化 -简写

    1. 简写: 名字和值一样的,可以省
    2. function可以不写
      let a=12;
      let b=5;
    
      let json={a, b};
    
      console.log(json);
    
    /*let json={
          a: 12,
          b: 5,
          show: function (){
            alert(this.a+this.b);
          }
        };*/
        let json={
          a: 12,
          b: 5,
          show(){
            alert(this.a+this.b);
          }
        };
    
        json.show();
    

    4.字符串

    • 模板字符串 可以输入变量、可以随意折行
      let json={name: 'blue', age: 18};
      alert(`我叫:${json.name},我今年${json.age}岁`);
    
    • startsWith()
    • endsWith()
     if(sNum.startsWith('135')){
        alert('移动');
      }else{
        alert('联通');
      }
    
      if(filename.endsWith('.txt')){
        alert('文本文件');
      }else{
        alert('图片文件');
      }
    
    • 字符串的遍历
      for ... of
      for (let codePoint of 'foo') {
        console.log(codePoint)
      }
      // "f"
      // "o"
      // "o"
    
    • includes(), startsWith(), endsWith()

    传统上,JavaScript 只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中。ES6 又提供了三种新方法。

    • includes():返回布尔值,表示是否找到了参数字符串。
    • startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
    • endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。
      let s = 'Hello world!';
    
      s.startsWith('Hello') // true
      s.endsWith('!') // true
      s.includes('o') // true
      s.startsWith('world', 6) // true
      s.endsWith('Hello', 5) // true
      s.includes('Hello', 6) // false
    
    • repeat()

    repeat方法返回一个新字符串,表示将原字符串重复n次。

      'x'.repeat(3) // "xxx"
      'hello'.repeat(2) // "hellohello"
      'na'.repeat(0) // ""
    

    5.面向对象

    • class/constructor

    • extends/super

    • this

      • 普通函数: 根据调用者确定 this会变
      • 箭头函数: 根据所在的环境 this恒定
      • bind 给函数定死一个this
    // 传统的js对象
        function Person(name, age){
          this.name=name;
          this.age=age;
        }
    
        Person.prototype.showName=function (){
          alert('我叫'+this.name);
        };
        Person.prototype.showAge=function (){
          alert('我'+this.age+'岁');
        };
    
        let p=new Person('blue', 18);
    
        p.showName();
        p.showAge();
    
        //------------------------------------------------
        function Worker(name, age, job){
          Person.call(this, name, age);
          this.job=job;
        }
    
        Worker.prototype=new Person();
        Worker.prototype.constructor=Worker;
        Worker.prototype.showJob=function (){
          alert('我是做:'+this.job);
        };
    
        let w=new Worker('blue', 18, '打杂的');
    
        w.showName();
        w.showAge();
        w.showJob();
    
    • es6面向对象
     class Person{
          constructor(name, age){
            this.name=name;
            this.age=age;
          }
    
          showName(){
            alert('我叫'+this.name);
          }
          showAge(){
            alert('我'+this.age+'岁');
          }
        }
    
        class Worker extends Person{
          constructor(name, age, job){
            //super-超类(父类)
            super(name, age);
            this.job=job;
          }
    
          showJob(){
            alert('我是做:'+this.job);
          }
        }
    
        let w=new Worker('blue', 18, '打杂的');
    
        w.showName();
        w.showAge();
        w.showJob();
    
    • bind 改变this指向
      class Person{
          constructor(name, age){
            this.name=name;
            this.age=age;
          }
    
          showName(){
            alert(this);
            alert('我叫'+this.name);
          }
          showAge(){
            alert('我'+this.age+'岁');
          }
        }
    
    
    
    
        let p=new Person('blue', 18);
    
        document.onclick=p.showName.bind(p);
    

    6.Promise

    • Promise 解决异步操作

      • 同步-串行 简单、方便
      • 异步并发 性能高、体验好
    • Promise用法

    let p=new Promise((resolve, reject)=>{
        resolve();
    
        reject();
      });
    
      p.then(()=>{}, ()=>{});
    
    • 单个
        let p=new Promise((resolve, reject)=>{
          //resolve       解决->成功
          //reject        拒绝->失败
    
          $.ajax({
            url: '1.txt',
            dataType: 'json',
            success(json){
              resolve(json);
            },
            error(err){
              reject(err);
            }
          });
        });
    
        p.then(json=>{
          alert('成功');
          console.log(json);
        }, err=>{
          alert('失败');
        });
    
    • 多个 all([])
    let p=new Promise((resolve, reject)=>{
          //resolve       解决->成功
          //reject        拒绝->失败
          $.ajax({
            url: '1.txt',
            dataType: 'json',
            success(json){
              resolve(json);
            },
            error(err){
              reject(err);
            }
          });
        });
    
        let p2=new Promise((resolve, reject)=>{
          //resolve       解决->成功
          //reject        拒绝->失败
          $.ajax({
            url: '2.txt',
            dataType: 'json',
            success(json){
              resolve(json);
            },
            error(err){
              reject(err);
            }
          });
        });
    
        let p3=new Promise((resolve, reject)=>{
          //resolve       解决->成功
          //reject        拒绝->失败
    
          $.ajax({
            url: '3.txt',
            dataType: 'json',
            success(json){
              resolve(json);
            },
            error(err){
              reject(err);
            }
          });
        });
    
        Promise.all([p, p2, p3]).then(arr=>{
          let [j1, a, j2]=arr;
    
          alert('成功');
          console.log(j1, a, j2);
        }, err=>{
          alert('失败');
        });
    

    1.Proimse有用——解除异步操作
    2.Promise有局限——带逻辑的异步操作麻烦

    Promise.all(); 与:所有的都成功
    Promise.race(); 或:只要有一个完成

    • generator-生成器

      • 能暂停
    • yield:

      1. 参数 function (a, b, c)
      2. 返回 return
        function *show(){
          alert('aaa');
    
          yield; // gne.next() 执行了yield的上部分,会停止下部分的执行。
          // 定时器中的gen.next()会执行下半部分
    
          alert('bbb');
        }
    
        let gen=show();
    
        gen.next();   //aaa
    
        setTimeout(function (){
          gen.next();   //bbb
        }, 5000);
    
       function *show(){
          alert('aaa');
    
          yield 55;
    
          alert('bbb');
    
          return 89;
        }
    
        let gen=show();
    
        let res1=gen.next();console.log(res1);    //{value: 55, done: false}
    
        let res2=gen.next();console.log(res2);    //{value: 89, done: true}
    

    try catch捕捉async await 的错误

    相关文章

      网友评论

          本文标题:ES6 面向对象 promise

          本文链接:https://www.haomeiwen.com/subject/fxpaaftx.html