7.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. //! 函数扩展:rest参数 也叫剩余参数
  2. //TODO 功能:接收一些列数字参数,完成求和
  3. // function sum() {}
  4. // sum(1);
  5. // sum(1, 2);
  6. // sum(1, 2, 3);
  7. // sum(1, 2, 3, 4);
  8. // ...
  9. //! ES5实现:由于sum函数调用的时候传入的实参个数不定,因此不能通过定义函数的形参就接收所有的参数
  10. //! 解决方案:使用函数中arguments
  11. function sum() {
  12. console.log(arguments); // arguments是伪数组对象(类数组对象)
  13. var total = 0; // 总和
  14. for (var i = 0; i < arguments.length; i++) {
  15. // 使用for循环去遍历出所有的实参,然后累加到total变量上
  16. total += arguments[i];
  17. }
  18. console.log(total);
  19. }
  20. // sum(1);
  21. // sum(1, 2);
  22. // sum(1, 2, 3);
  23. // sum(1, 2, 3, 4);
  24. //! ES6 推荐使用rest参数 代替 arguments
  25. //! rest参数 是真数组,那么就可以使用数组对象的所有方法
  26. // function sum(...rest) {
  27. // // console.log(rest);
  28. // var total = 0;
  29. // rest.forEach(function (v) {
  30. // total += v;
  31. // });
  32. // console.log(total);
  33. // }
  34. // sum(1);
  35. // sum(1, 2);
  36. // sum(1, 2, 3);
  37. // sum(1, 2, 3, 4);
  38. //TODO 功能: 以base为基础值,去累加其他传入的数字参数
  39. function sum(base, ...rest) {
  40. console.log(rest);
  41. }
  42. sum(1, 1); // 2 [1]
  43. sum(10, 2); // 12 [2]
  44. sum(100, 2, 3); // [2, 3]
  45. sum(1000, 2, 3, 4); // [2, 3, 4]
  46. //! arguments比较危险,如果手动修改arguments里的数据 会直接影响到传入的实参
  47. function test1(x) {
  48. arguments[0] = 10;
  49. console.log(x); // 1? or 10?
  50. }
  51. test1(1);
  52. function test2(x, ...rest) {
  53. rest[0] = 100;
  54. console.log(x);
  55. }
  56. test2(1);