默认参数
默认参数
JS 中,若函数没有传参也没有设置默认参数,则参数默认为 undefined,
若设置默认参数,且函数没有传参或传参为 undefined,则被设置为默认参数
function add(a, b=1) {
return a + b;
}
add(2,2); // 4
add(2); // 3
已经遇到的参数可用于以后的默认参数
function add(a, b, result = a + b) {
return [a, b, result];
}
add(1, 2); // [1, 2, 3]
add(1, 2, 4); // [1, 2, 4]
默认参数可设置在普通参数之前
function f(x=1, y) {
return [x,y];
}
f(); // [1, undefined]
f(2); // [2, undefined]
通过解构赋值为参数赋值
function f([x,y] = [1,2], {z:z} = {z: 3}) {
return x + y + z;
}
f(); // 6
剩余参数 Rest syntax
剩余参数
剩余参数允许我没将一个不定数量的参数表示为一个数组
语法:
function(a, b, ...theArgs) {}
(a, b, ...theArgs) => {}
示例:
sum = (...theArgs) => theArgs.reduce((previous, current) => previous + current);
sum(1, 2, 3); //6
解构剩余函数
fn = (...[a, b, c]) => {
return a + b + c;
}
fn(1); // NaN (b and a are undefined)
fn(1, 2, 3); // 6
fn(1, 2, 3, 4); // 6 (the fourth parameter is not destructured)
与 arguments 对象的区别:
- 剩余函数只包括没有对应形参的实参,arguments 对象包括传给函数的所有实参
- arguments 对象不是真正的数组,剩余函数是真正的 Array 示例,拥有数组的方法,如 sort, map, forEach, pop 等
- arguments 对象有一些附加属性,如 callee
展开运算符 Spread syntax(…)
Spread syntax...
可在函数调用、数组构造时,将可迭代(iterable)对象如 array 或 string 等在语法层面展开
在函数调用时展开语法,等价于 apply
构造数组sum = (x, y, z) => x + y + z;
const numbers= [1, 2, 3];
sum(...numbers); // 6
sum.apply(null, numbers); // 6
浅拷贝数组,相当于 Array.slice ```javascript var arr = [1, 2, 3]; var arr2 = […arr1]; // 相当于 arr.slice()var arr1 = ['a', 'b'];
var arr2 = ['q', ... arr1, 'w'] // ['q', 'a', 'b', 'w']
arr2.push(4) ; // arr2: [1, 2, 3, 4], arr: [1, 2, 3]
链接数组,相当于 Array.concat
```javascript
var arr1 = [1, 2];
var arr2 = [3, 4];
var arr3 = arr1.concat(arr2); // [1, 2, 3, 4]
var arr3 = [...arr1, ...arr2]; // [1, 2, 3, 4]
构造对象
var obj1 = { foo: 'bar', x: 42 };
var obj2 = { foo: 'baz', y: 13 };
var clonedObj = { ...obj1 };
// 克隆后的对象: { foo: "bar", x: 42 }
var mergedObj = { ...obj1, ...obj2 };
// 合并后的对象: { foo: "baz", x: 42, y: 13 }
与剩余参数的区别:两者相反,展开语法将数组展开为其中的各个元素,剩余语法将多个元素收集起来并“凝聚”为单个元素