17.1、子程序的多处返回
17.1.1、核心说明
MDN:return
语句终止函数的执行,并返回一个指定的值给函数调用者
在某些子程序中,一旦知道了答案,你会希望马上返回到调用方子程序。如果子程序被定义为检测处错误以后就不会做任何更多的清楚操作,那么不马上返回就意味着你还得写更多的代码。**如果能增强可读性,那么就使用return
17.1.2 事例演示
转换如下:
/**
* @description: 比两个数据大小
* @param {*} v1
* @param {*} v2
*/
const LESS_THAN = 0
const GREATER_THAN = 1
const EQUAL_THAN = 2
function 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 ot
console.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)