1、函数参数默认值【详情例子参照ESMAScript 6入门 (阮一峰)】
- 允许为函数的参数设置默认值,即直接写在参数定义的后面。【例子1】
- 参数变量是默认声明的,所以不能用
let
或const
再次声明。【例子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入门 (阮一峰),仅仅当作自己的笔记而已。