zoukankan      html  css  js  c++  java
  • 【ES6】函数的扩展

    1、函数参数默认值【详情例子参照ESMAScript 6入门 (阮一峰)

    • 允许为函数的参数设置默认值,即直接写在参数定义的后面。【例子1】
    • 参数变量是默认声明的,所以不能用letconst再次声明。【例子2】
    • 参数默认值不是传值的,而是每次都重新计算默认值表达式的值。(惰性求值)【例子3】

    2、函数的length属性

    • 指定了默认值后,length属性将失真。【因为length属性的含义是,该函数预期传入的参数个数。】

    3、rest参数【...变量名】,用于获取函数的多余参数

    注意:rest 参数之后不能再有其他参数(即只能是最后一个参数),否则会报错。

         函数的length属性,不包括 rest 参数。

    求和

    function add(...values) {
      let sum = 0;
      for (var val of values) {
        sum += val;
      }
      return sum;
    }
    add(2, 5, 3) // 10 

    利用rest参数改写数组push方法

    function push(array, ...items) {
      items.forEach(function(item) {
        array.push(item);
        console.log(item);
      });
    }
    
    var a = [];
    push(a, 1, 2, 3)
    

    4、箭头函数

    • 不绑定this【箭头函数的this是固定的】、arguments
    • 不可使用new命令和yield命令
    • 箭头函数导致this总是指向函数定义生效时所在的对象
    var f = () => 5;/
    // 等同于 var f = function () { return 5 };
    //有参数 var sum = (num1, num2) => { return num1 + num2; }

    实例:

    // 正常函数写法
    [1,2,3].map(function (x) {
      return x * x;
    });
    
    // 箭头函数写法
    [1,2,3].map(x => x * x);
    

    5、尾递归【函数调用自身,称为递归。如果尾调用自身,就称为尾递归】

    只需要知道循环可以用递归代替,而一旦使用递归,就最好使用尾递归。

    //旧的
    function factorial(n) {
      if (n === 1) return 1;
      return n * factorial(n - 1);
    }
    
    factorial(5) // 120
    
    //尾递归
    function factorial(n, total) {
      if (n === 1) return total;
      return factorial(n - 1, n * total);
    }
    
    factorial(5, 1) // 120
    

     尾递归优化

    /* 普通 */
    function sum(x, y) {
      if (y > 0) {
        return sum(x + 1, y - 1);
      } else {
        return x;
      }
    }
    
    sum(1, 10)
    //11
    
    /* 尾递归优化 */
    function trampoline(f) {
      while (f && f instanceof Function) {
        f = f();
      }
      return f;
    }
    function sum(x, y) {
      if (y > 0) {
        return sum.bind(null, x + 1, y - 1);
      } else {
        return x;
      }
    }
    trampoline(sum(1, 100000))
    //100001
    

      

    以上ES6均参考ESMAScript 6入门 (阮一峰),仅仅当作自己的笔记而已。

  • 相关阅读:
    docker常用操作
    Mybatis架构与原理
    无服务计算小项目 : 基于Google Cloud Function + Cloud Firestore + Cloud SQL构建实时数据处理流
    Kafka 学习笔记(一)
    Spark 学习笔记 (三): Spark MLlib库的数据类型
    Code Jam Kickstart 2019 Round A 题解
    Spark 学习笔记 (二): 深入Spark计算引擎
    LeetCode 121th Weekly Contest 总结
    算法总结
    943.Find the Shortest Superstring --- 旅行商问题&状态压缩DP
  • 原文地址:https://www.cnblogs.com/chorkiu/p/10442527.html
Copyright © 2011-2022 走看看