不定参数,三个点(...)
含义:
①用在形参中, 表示传递给他的参数集合, 类似于arguments, 叫不定参数.
语法格式: 在形参面前加三个点( ... )
②用在数组前面,可以把数组的值全部打散,展开,叫展开运算符.
语法格式: 在数组面前加三个点( ... )
在形参中:
//es5求和
function add(){
var res=0;
for(var i=0;i<arguments.length;i++){
res+=arguments[i]
}
return res
}
console.log(add(10,20,30))
//不定参数
function add(...val){
console.log(val); //[10, 20, 30]
console.log(typeof val); //object
}
add(10,20,30)
//es6的不定参数 修改求和
function add(...val){
var res=0;
for(var i=0;i<val.length;i++){
res+=val[i]
}
return res
}
console.log(add(10,20,30))
---------------------------------------------
//注意
function(...val,res){} //报错,不定参数要放形参后面
function(...v,...v){} //报错,不能出现多个不定参数
function add(res,...val){
console.log(res); //10
console.log(val); //[20, 30, 40, Array[2]]
}
add(10,20,30,40,[100,200])
---------------------------------------------
//有选择性拷贝对象 ,只要其中两个
var oUser={
name:'aaa',
age:22,
sex:'man'
}
/*
function copyObj(src){//src原对象
var target=Object.create(null);//创建一个目标对象
for(var i=1;i<arguments.length;i++){//从1开始才是拷贝属性
target[arguments[i]]=src[arguments[i]]
}
return target
}
*/
//es6修改
function copyObj(src,...attr){//src原对象
var target=Object.create(null);//创建一个目标对象
for(var i=0;i<attr.length;i++){//从1开始才是拷贝属性
target[attr[i]]=src[attr[i]]
}
return target
}
var oUser2 = copyObj(oUser,'name','sex');
console.log(oUser2); //Object {name: "aaa", sex: "man"}
//不定参不会影响grguments
function show(...val){
console.log(val.length); //3
console.log(arguments.length); //3
val[0]=100;
console.log(val[0],val[1],val[2]); //[100 10 30]
console.log(arguments[0],arguments[1],arguments[2]); //[4 10 30]
}
show(4,10,30)
在数组中(展开运算符):
//求变量和数组的最大值
let a=10,b=20;
console.log(Math.max(a,b))
let arr=[10,200,300,3]
//console.log(Math.max(arr)); //Math.max()不能求数组
//es5做法
console.log(Math.max.apply(Math,arr)); //300
//es6的数组的三个点 ,展开运算符
console.log(Math.max(...arr,4,30,40));