默认参数

  • 函数默认参数允许在没有值或undefined被传入时使用默认形参。
    1. function multiply(a) {
    2. return a ;
    3. }
    4. multiply() //输出为undefined

    基本注意使用

    ```javascript
  1. 可以改变默认值 function test(num = 1) { console.log(typeof num); }

test(); // 1

  1. 调用时解析 function append(value, array = []) { array.push(value); return array; }

append(1); //[1] => 直接push到array数组,array数组调用时刻解析 append(2); //[2]

  1. 默认参数可用于后面的默认参数 function greet(name, greeting, message = greeting + ‘ ‘ + name) { return [name, greeting, message]; }

greet(‘David’, ‘Hi’);
// [“David”, “Hi”, “Hi David”] => 使用上一次的参数

  1. 不能引用内部的默认参数 function f(a = go()) { function go() { return ‘:P’; } } // 会报错的

  2. 通过解构赋值为参数赋值 function f([x, y] = [1, 2], {z: z} = {z: 3}) { return x + y + z; }

f(); // 6

  1. <a name="bH1Ap"></a>
  2. ## 剩余参数
  3. - **剩余参数**语法允许我们将一个不定数量的参数表示为一个数组。
  4. ```javascript
  5. function fun1(...theArgs) {
  6. alert(theArgs.length);
  7. }
  8. fun1(); // 弹出 "0", 因为theArgs没有元素
  9. fun1(5); // 弹出 "1", 因为theArgs只有一个元素
  10. fun1(5, 6, 7); // 弹出 "3", 因为theArgs有三个元素

扩展运算符

  • 展开语法将数组展开为其中的各个元素,而剩余语法则是将多个元素收集起来并“凝聚”为单个元素。
  • 展开语法,可以在函数调用/数组构造时, 将数组表达式或者string在语法层面展开;
    • 还可以在构造字面量对象时, 将对象表达式按key-value的方式展开。
      • (译者注: 字面量一般指 [1, 2, 3] 或者 {name: "mdn"} 这种简洁的构造方式)

        函数调用时使用展开语法

        ```javascript function myFunction(x, y, z) { console.log(x, y, z) }

var args = [0, 1, 2];

myFunction(…args); // 展开语法

  1. <a name="niN4K"></a>
  2. #### 数组使用展开语法
  3. ```javascript
  4. 1. 数组使用展开语法
  5. let parts = ['shoulders', 'knees'];
  6. let lyrics = ['head', ...parts, 'and', 'toes'];
  7. // ["head", "shoulders", "knees", "and", "toes"]
  8. 2. 数组拷贝 =>浅拷贝
  9. let arr = [1, 2, 3];
  10. let arr2 = [...arr];
  11. // 展开语法和 Object.assign() 行为一致, 执行的都是浅拷贝(只遍历一层)。
  12. 3.连接多个数组
  13. let arr1 = [0, 1, 2];
  14. let arr2 = [3, 4, 5];
  15. arr1 = [...arr2, ...arr1];
  16. // arr1 现在为 [3, 4, 5, 0, 1, 2]
  17. // arr1 是新创建的数组,与原来的 arr1 不是同一个索引

构造字面量对象时使用展开语法

  1. let obj1 = { foo: 'bar', x: 42 };
  2. let obj2 = { foo: 'baz', y: 13 };
  3. let clonedObj = { ...obj1 };
  4. // 克隆后的对象: { foo: "bar", x: 42 }
  5. let mergedObj = { ...obj1, ...obj2 };
  6. // 合并后的对象: { foo: "baz", x: 42, y: 13 }
  7. // 注意foo: 'bar' 已经消失

REST参数

概念

REST参数是…的另一个作用,能够将多个数据合并成一个数组,或者收集剩余的数据为一个数组。效果可以说是跟扩展运算符是相反的。

作用

  • 可以替代arguments
  • 结合解构赋值
    1. function demo (...a){
    2. console.log(a);//[1,2,3];
    3. }
    4. demo(1,2,3);
    5. //...作为最后的REST参数时,会将剩余的实际参数都放在一个数组里
    6. function demo2 (a,...b){
    7. console.log(a);//1
    8. console.log(b);//[2,3]
    9. }
    10. demo2(1,2,3);
    注意:REST参数不能用于中间的某个形式参数,会报错
    1. function demo3 (a,...b,c){
    2. }
    3. demo3(1,2,3);//报错

    扩展运算符和REST参数的区别

    扩展运算符是用于展开数组或对象、字符串。而REST参数则是用于形式参数中,用于将多个数据收缩为一个数组。