一起养成写作习惯!这是我参与「掘金日新计划 · 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是个类数组,不能直接用数组的一些方法。
优点:
- 支持箭头函数。
- 生成的数组是纯正的数组类型,所以使用数组里所有的函数,而arguments就不能直接使用。
- 自定义数组名arr,比arguments简单的多。
- 为什么叫rest剩余参数
...可以和其他形参配合使用。- 只获得其他形参不要的剩余参数。
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:'小明'}