17.1、子程序的多处返回

17.1.1、核心说明

MDN:return语句终止函数的执行,并返回一个指定的值给函数调用者

在某些子程序中,一旦知道了答案,你会希望马上返回到调用方子程序。如果子程序被定义为检测处错误以后就不会做任何更多的清楚操作,那么不马上返回就意味着你还得写更多的代码。**如果能增强可读性,那么就使用return

17.1.2 事例演示

image.png
转换如下:

  1. /**
  2. * @description: 比两个数据大小
  3. * @param {*} v1
  4. * @param {*} v2
  5. */
  6. const LESS_THAN = 0
  7. const GREATER_THAN = 1
  8. const EQUAL_THAN = 2
  9. function compareNumber(v1 , v2) {
  10. if(v1 < v2) {
  11. return LESS_THAN
  12. } else if( v1 > v2){
  13. return GREATER_THAN
  14. }
  15. return EQUAL_THAN
  16. }

17.2、递归

17.2.1 递归的介绍

image.png

17.2.2 递归的使用

  • 确认递归能够停止
  • 使用安全计数器防止出现无穷递归
  • 把递归限制在一个子程序内image.pngimage.png
  • 留心栈空间image.png
  1. /**
  2. * @description: 阶乘
  3. * @param {*} total
  4. * @return {*}
  5. */
  6. const total = (num) => {
  7. if (num > 1) {
  8. return num * total(num - 1)
  9. }
  10. return num
  11. }
  12. //解决阶乘比较推荐的方式
  13. const total1 = n => {
  14. let num = 1;
  15. for(let i = n ; i > 0 ; i --) {
  16. num = num * i
  17. }
  18. return num
  19. }
  20. //这种方式的好处?
  21. const total2 = (n, t = 1) => {
  22. if (n === 1) {
  23. return t
  24. }
  25. return total2(n - 1, t * n)
  26. }
  27. /**
  28. * @description: 深拷贝
  29. * @param {*} o1 返回对象
  30. * @param {*} o2 目标对象
  31. * @return {*}
  32. */
  33. const clone = (o1, o2) => {
  34. Object.entries(o2).forEach(([key, value]) => {
  35. if (typeof value === "object") {
  36. o1[key] = {}
  37. clone(o1[key], value)
  38. }
  39. o1[key] = value
  40. })
  41. }

警告注意⚠️image.png

17.3、goto 类似于 js:label语法

17.3.1 MDN中label语法介绍说明

  • JavaScript 没有 goto 语句,标记只能和 breakcontinue 一起使用

image.png
事例如下:

  1. const forDemo = (param) => {
  2. ot: {
  3. console.log(1111111)
  4. break ot
  5. console.log(2222222)
  6. }
  7. fir: for (let i = 0; i < 3; i++) {
  8. sec: for (let j = 0; j < 3; j++) {
  9. for (let q = 0; q < 3; q++) {
  10. if (q == param) {
  11. console.log('label', i , j , q)
  12. break sec
  13. // continue fir
  14. }
  15. console.log("forDemo i ,j ,q:", i, j, q)
  16. }
  17. }
  18. }
  19. }
  20. forDemo(1)

两次运行结果:
image.png

17.4、针对不常见控制结构的观点

image.png

核对表

image.png

本章脑图

image.png

扩展专区

image.png