递归
递归是什么? 一个函数在内部调用自己,这个函数就是递归函数。
应用场景
- 数组求和
let arr = [100, 200, 300, [400, 500, [49, 59, 80, [30, 60, [80, 100]]]]]
// 递归求和
let num = 0
function fn(arr) {
// 对arr进行循环
arr.forEach(item => {
// 判断是否是复杂数据类型
if (typeof item === "object") {
// console.log(item);
// 是的话就自己调用自己,并把当前的数据当作实参传出去
fn(item)
} else {
// 不是复杂数据类型就累加求和
num += item
}
})
}
fn(arr);
console.log(num);
- 斐波那契数列
function fn(n) {
if (n == 1 || n == 2) return 1
return fn(n - 1) + fn(n - 2)
}
console.log(fn(8));
- 求 children里money的总和
let arr1 = [
{
name: "张三",
money: 100,
children: [
{ name: "张欢欢", money: 200 },
{
name: "张乐乐",
money: 100,
children: [
{ name: "张小欢", money: 300 },
{ name: "张小乐", money: 400 },
],
},
],
},
{
name: "李四",
money: 100,
children: [
{ name: "李红红", money: 500 },
{ name: "李明明", money: 600 },
],
},
];
let total = 0
function fn(arr) {
arr.forEach(item => {
if (item.children instanceof Array) {
fn(item.children)
} else {
total += item.money
}
})
}
fn(arr1)
console.log(total);
TS中的枚举
枚举分为数字枚举、字符串枚举、异构枚举,枚举的使用是通过enum关键字进行定义。
- 数字枚举 数字枚举默认从零开始,赋值后,从你赋值的开始依次加一,假如你给一个赋值为12,那么后面的依次为13,14,15.........
// enum Direction {
// front = 1,
// back = 2,
// left = 3,
// right = 4
// }
// function fn(direction: Direction) {
// console.log(direction);
// }
// fn(Direction.back)
// fn(Direction.front)
- 字符串枚举
如果设定了一个变量为字符串之后,后续的字段也需要赋值字符串,否则报错:
enum Direction {
front = '前进',
back = '后撤',
left = '左满舵',
right = '右满舵'
}
function ship(direction: Direction) {
console.log(direction);
}
ship(Direction.back)
ship(Direction.front)
- 异构枚举
即将数字枚举和字符串枚举结合起来混合起来使用
enum BooleanLikeHeterogeneousEnum {
No = 0,
Yes = 'YES',
}
TS中的接口类型
- TypeScript 的核心原则之一是对值所具有的结构进行类型检查,并且只要两个对象的结构一致,属性和方法的类型一致,则它们的类型就是一致的。 在 TypeScript 里,接口的作用就是为这些类型命名和为代码或第三方代码定义契约。
- 在定义接口时,不要把它理解为是在定义一个对象,{}括号包裹的是一个代码块,里面是声明语句,只不过声明的不是变量的值而是类型。声明也不用等号赋值,而是冒号指定类型。每条声明之前用换行分隔即可,也可以使用分号或者逗号。
- 接口属性,分为可选属性 ?修饰,只读属性 readonly 修饰,多余属性(索引签名)
- 接口继承, 一个接口可以继承自另一个或者多个接口,关键字 extends
声明接口
使用interface来声明一个接口
interface typeObj {
name: string
age: number
fn: Function
}
使用 用implements来使用一个接口
class obj implements typeObj {
name: string
age: number
constructor(name: string, age: number) {
this.name = name
this.age = age
}
fn(): void {
console.log(`我是${this.name}我${this.age}岁`);
}
}