总结一波,es6参数增强(...)

202 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

参数增强的基本用途

参数默认值(default)

问题:调用函数时,如果不传入实参值,虽然语法不报错,但是形参默认接住undefined,undefined极容易造成程序错误。
解决:可以给参数默认值。即使不传入实参值时,形参变量也有默认值使用时,就为形参指定默认值。

function fun(形参1=默认值1,形参2=默认值2...){
 //调用函数,给形参有传实参值时,优先使用实参值,否则,就默认使用形参的默认值
}

另外一个问题:换餐

function order(mianCourse='汉堡',dessert='蛋挞',drink='可乐'){}  
order(undefined,'慕斯蛋糕');//换中间的参数值

上面代码想换中间的参数值,order(undefined,'慕斯蛋糕'),这种写法不好,有其他更好的解决办法没,es6的参数增强,解构就可以。

剩余参数

问题:定义函数计算任意多个数的和

  • arguments实现
//定义一个函数,求任意多个数字的和
function add() {
    // arguments[]
    var result = 0;
    for (var n of arguments) {
        result += n;
    }
    return result;
}
console.log(add(1, 2, 3));//6
console.log(add(1, 2, 3, 4, 5));//15
  • 改为箭头函数
//定义一个函数,求任意多个数字的和
 var add=()=> {
    // arguments[]
    var result = 0;
    //会报错,arguments is not defined
    for (var n of arguments) {
        result += n;
    }
    return result;
}
console.log(add(1, 2, 3));//6
console.log(add(1, 2, 3, 4, 5));//15

会报错,arguments is not defined。箭头函数不支持arguments
解决:es6剩余参数

//定义一个函数,求任意多个数字的和  
//将来传进来的所有实参值,都会被...收集起来,保存到..后指定的数组中
 var add=(...arr)=> {
    var result = 0;
    for (var n of arr) {
        result += n;
    }
    return result;
}
console.log(add(1, 2, 3));//6
console.log(add(1, 2, 3, 4, 5));//15

将来传进来的所有实参值,都会被...收集起来,保存到..后指定的数组中,将来,只要在es6箭头函数中碰到参数个数不确定的情况,都要用剩余参数语法来代替,arguments,事实上,用剩余参数语法,参数会是个数组,而使用arguments是个类数组,不能直接用数组的一些方法。
优点:

  1. 支持箭头函数。
  2. 生成的数组是纯正的数组类型,所以使用数组里所有的函数,而arguments就不能直接使用。
  3. 自定义数组名arr,比arguments简单的多。
  • 为什么叫rest剩余参数
  1. ...可以和其他形参配合使用。
  2. 只获得其他形参不要的剩余参数。
var 函数名=(形参1, 形参2,...数组名arr)=>{

//形参1接收实参1

//形参2接收实参2

//…数组名arr接收除实参值1、2之外其余实参

}

总结:只要箭头函数中,不确定实参值个数时,都可用...数组名代替arguments记住所有剩余实参值。

展开运算符

问题:
虽然:Math.max(),可获得多个数中的最大值:
Math.max(1,7,2,5) 返回7
但是,Math.max()不支持数组
var arr=[1,7,2,5];
Math.max(arr) //返回NaN
不支持获取数组中最大值!
解决:
先拆散数组,再传参。
不好的解决方法:apply(apply可以打散拆散数组类数组参数).
var =[1,2,3,4,5]
Math.max.apply(替换this的对象,要拆散的数组)
本例中,与this无关,指向拆散数组,即使第一个参数乱写,也会被迫要传一个参数,所以apply不是很合适。
其他解决方法:...展开运算符
var arr=[1,7,2,5];
Math.max(...arr)
总结:
只要希望单纯拆散数组,都要用...展开运算符,只有即替换this,又要拆散数组时,才用apply。定义函数时,形参列表中的...,表示收集,调用函数时,实参列表中的...,反而表示拆散

语法糖(简写)

  • 复制数组
var arr1=[1,2,3];  
var arr2=[...arr1]
  • 合并多个数组和元素
var arr1=[1,2,3];  
var arr2=[7,8,9 ]  
var arr3=[...arr1,4,5,6,...arr2,10]  

  • 克隆一个对象
var obj={  
name:'静静',  
age:18
}  
//克隆obj   
var obj1={...obj}  
  • 合并多个对象和属性
var obj1={  
name:'静静'
}    
var obj2={  
age:18
}    
var obj3={...obj1,say:function(){},...obj2,sonName:'小明'}