【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入门 (阮一峰),仅仅当作自己的笔记而已。

原文地址:https://www.cnblogs.com/chorkiu/p/10442527.html