ES6函数扩展

9 篇文章 0 订阅

函数参数的默认值:
在ES5中,我们想给函数一个默认值,需要这样写:

function add (x, y) {
    y = y || 'ss';
    console.log(x, y);
}

在ES6中 ,可以这样写:

function add (x, y = 'ss'){
    console.log(x, y)
    }

add('dd') // ddss
add('ss','dd') //ssdd
add('dd','')  //dd

我们只需要在参数上直接写上我们想要的默认值就好了。
当我们给函数一个变量的时候,就声明了一个变量,我们在函数内部就不可以在用let或const进行声明:

function add (x, y = 'aa'){
    let y = dd;

这样的写法是es6不允许的。

解构赋值函数参数

我们可以解构赋值的给函数传入参数:


function add([x, y]){
  return x + y;
}

add([1, 2]); // 3

在前面的解构赋值中还有一些例子可以参考。

rest参数
es6中增加了rest参数,其形式为:… 变量名
也就是说在我们不知道参数个数的情况下,就可以使用这种方法:

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

需要注意的是,rest参数一定是最后一个参数:

function (a ,...value ,b){
     //会报错
    }

扩展运算符
使用方法为:…

console.log(...[1, 2, 3, 4]);
// 1, 2, 3, 4

扩展运算符可以用来进行数组的合并:

var arr1 = [1, 2]
var arr2 = [3, 4]
var arr3 = [5, 6]
var arr4 = [...arr1,...arr2,...arr3]
//arr4 = [1, 2, 3, 4, 5, 6]
const [a,...arr] = [1, 2, 3, 4, 5, 6];
//a = 1  arr = [2, 3, 4, 5, 6]
[...'hello']
//['h','e','l','l','o']

箭头函数
es6新增了函数的写法,箭头函数,下面是箭头函数的基本写法:

const a = y => y

等同于:

const a = function (y){
    return y;
}

如果不需要参数,就这样写:

cosnt a = () => y;

如果箭头函数的代码块多与一行,我们就用大括号包起来:

const a = (a, b) => {return a + b};

如想返回一个对象,需要用圆括号包起来:

cosnt a = id =>({id : iii,name : li});

箭头函数的this是固定的,就指向函数定义是的作用域,不会改变。

尾调函数
尾调函数就是某个函数在最后一步调用另一个函数。

function a (){
    return b():
}

这就是一个最简单的尾调函数。
那么为什么要有尾递归这个方法出现那,我在网上看了半天,发现到最后总结起来就是一句话:”显得高端”。
其实解释就是,因为函数调用函数,会生成调用帧,这样就会占用一些内存空间,如果我们采用尾调用的方法,就可以避免这个问题出现。
尾递归
函数在函数内部调用自己,叫做递归,函数在尾部调用自己,就是尾递归,由于上面的原因,尾递归可以大大的减少对内存的占用,是代码的执行效率更高。
下面是两个例子:


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 Fibonacci (n) {  
  if ( n <= 1 ) {return 1};  

  return Fibonacci(n - 1) + Fibonacci(n - 2);  
}

运用尾递归就要这样写:

function Fibonacci2 (n , ac1 = 1 , ac2 = 1) {  
  if( n <= 1 ) {return ac2};  

  return Fibonacci2 (n - 1, ac2, ac1 + ac2);  
}

是不是觉得代码难理解了,尾递归的优化写法有好多,但是我发现只有es6的写法是最简单易懂的,因为es6提供了默认的参数值:

function factorial(n, total = 1) {  
  if (n === 1) return total;  
  return factorial(n - 1, n * total);  
}

这个与上面的第一个例子一样,计算一个数的阶乘。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值