默认参数
- 函数默认参数允许在没有值或
undefined被传入时使用默认形参。function multiply(a) {return a ;}multiply() //输出为undefined
基本注意使用
```javascript
- 可以改变默认值 function test(num = 1) { console.log(typeof num); }
test(); // 1
- 调用时解析 function append(value, array = []) { array.push(value); return array; }
append(1); //[1] => 直接push到array数组,array数组调用时刻解析 append(2); //[2]
- 默认参数可用于后面的默认参数 function greet(name, greeting, message = greeting + ‘ ‘ + name) { return [name, greeting, message]; }
greet(‘David’, ‘Hi’);
// [“David”, “Hi”, “Hi David”] => 使用上一次的参数
不能引用内部的默认参数 function f(a = go()) { function go() { return ‘:P’; } } // 会报错的
通过解构赋值为参数赋值 function f([x, y] = [1, 2], {z: z} = {z: 3}) { return x + y + z; }
f(); // 6
<a name="bH1Ap"></a>## 剩余参数- **剩余参数**语法允许我们将一个不定数量的参数表示为一个数组。```javascriptfunction fun1(...theArgs) {alert(theArgs.length);}fun1(); // 弹出 "0", 因为theArgs没有元素fun1(5); // 弹出 "1", 因为theArgs只有一个元素fun1(5, 6, 7); // 弹出 "3", 因为theArgs有三个元素
扩展运算符
- 展开语法将数组展开为其中的各个元素,而剩余语法则是将多个元素收集起来并“凝聚”为单个元素。
- 展开语法,可以在函数调用/数组构造时, 将数组表达式或者string在语法层面展开;
var args = [0, 1, 2];
myFunction(…args); // 展开语法
<a name="niN4K"></a>#### 数组使用展开语法```javascript1. 数组使用展开语法let parts = ['shoulders', 'knees'];let lyrics = ['head', ...parts, 'and', 'toes'];// ["head", "shoulders", "knees", "and", "toes"]2. 数组拷贝 =>浅拷贝let arr = [1, 2, 3];let arr2 = [...arr];// 展开语法和 Object.assign() 行为一致, 执行的都是浅拷贝(只遍历一层)。3.连接多个数组let arr1 = [0, 1, 2];let arr2 = [3, 4, 5];arr1 = [...arr2, ...arr1];// arr1 现在为 [3, 4, 5, 0, 1, 2]// arr1 是新创建的数组,与原来的 arr1 不是同一个索引
构造字面量对象时使用展开语法
let obj1 = { foo: 'bar', x: 42 };let obj2 = { foo: 'baz', y: 13 };let clonedObj = { ...obj1 };// 克隆后的对象: { foo: "bar", x: 42 }let mergedObj = { ...obj1, ...obj2 };// 合并后的对象: { foo: "baz", x: 42, y: 13 }// 注意foo: 'bar' 已经消失
REST参数
概念
REST参数是…的另一个作用,能够将多个数据合并成一个数组,或者收集剩余的数据为一个数组。效果可以说是跟扩展运算符是相反的。
作用
- 可以替代arguments
- 结合解构赋值
注意:REST参数不能用于中间的某个形式参数,会报错function demo (...a){console.log(a);//[1,2,3];}demo(1,2,3);//...作为最后的REST参数时,会将剩余的实际参数都放在一个数组里function demo2 (a,...b){console.log(a);//1console.log(b);//[2,3]}demo2(1,2,3);
function demo3 (a,...b,c){}demo3(1,2,3);//报错
扩展运算符和REST参数的区别
扩展运算符是用于展开数组或对象、字符串。而REST参数则是用于形式参数中,用于将多个数据收缩为一个数组。
