17.1、子程序的多处返回
17.1.1、核心说明
MDN:return语句终止函数的执行,并返回一个指定的值给函数调用者
在某些子程序中,一旦知道了答案,你会希望马上返回到调用方子程序。如果子程序被定义为检测处错误以后就不会做任何更多的清楚操作,那么不马上返回就意味着你还得写更多的代码。**如果能增强可读性,那么就使用return
17.1.2 事例演示

转换如下:
/*** @description: 比两个数据大小* @param {*} v1* @param {*} v2*/const LESS_THAN = 0const GREATER_THAN = 1const EQUAL_THAN = 2function compareNumber(v1 , v2) {if(v1 < v2) {return LESS_THAN} else if( v1 > v2){return GREATER_THAN}return EQUAL_THAN}
17.2、递归
17.2.1 递归的介绍
17.2.2 递归的使用
- 确认递归能够停止
- 使用安全计数器防止出现无穷递归
- 把递归限制在一个子程序内


- 留心栈空间

/*** @description: 阶乘* @param {*} total* @return {*}*/const total = (num) => {if (num > 1) {return num * total(num - 1)}return num}//解决阶乘比较推荐的方式const total1 = n => {let num = 1;for(let i = n ; i > 0 ; i --) {num = num * i}return num}//这种方式的好处?const total2 = (n, t = 1) => {if (n === 1) {return t}return total2(n - 1, t * n)}/*** @description: 深拷贝* @param {*} o1 返回对象* @param {*} o2 目标对象* @return {*}*/const clone = (o1, o2) => {Object.entries(o2).forEach(([key, value]) => {if (typeof value === "object") {o1[key] = {}clone(o1[key], value)}o1[key] = value})}
17.3、goto 类似于 js:label语法
17.3.1 MDN中label语法介绍说明
- JavaScript 没有
goto语句,标记只能和break或continue一起使用

事例如下:
const forDemo = (param) => {ot: {console.log(1111111)break otconsole.log(2222222)}fir: for (let i = 0; i < 3; i++) {sec: for (let j = 0; j < 3; j++) {for (let q = 0; q < 3; q++) {if (q == param) {console.log('label', i , j , q)break sec// continue fir}console.log("forDemo i ,j ,q:", i, j, q)}}}}forDemo(1)
17.4、针对不常见控制结构的观点
核对表
本章脑图

扩展专区

