TypeScript面试题集合【初级、中级、高级】
初级面试题
TypeScript是JavaScript的超集,由Microsoft开发,它添加了可选的静态类型和基于类的面向对象编程。TypeScript旨在解决JavaScript的某些局限性,比如缺乏静态类型和基于类的面向对象编程,同时保持了与JavaScript的兼容性。通过添加这些特性,TypeScript使得代码更易于维护和扩展,提供了更好的工具和编辑器支持,以及更强大的类型检查功能。
TypeScript中的基本类型包括:布尔值(boolean)、数字(number)、字符串(string)、数组(Array)、元组(Tuple)、枚举(Enum)、任意值(any)、空值(void)、Null和Undefined、Never、以及对象(Object,包括普通对象、数组、函数等)。此外,TypeScript还支持类型别名(Type Aliases)和映射类型(Mapped Types)等高级类型。
在TypeScript中,可以使用let
、const
或var
关键字来声明变量。let
和const
提供了块级作用域,而var
提供的是函数作用域或全局作用域。例如:
let myVariable: string = "Hello, World!";
const myConst: number = 42;
var myVar: boolean = false;
接口是TypeScript中的一个核心特性,它用于定义一个对象的结构,包括对象应该具有的属性和方法。接口提供了一种强类型的方式来确保对象实现特定的属性或方法。通过接口,可以实现代码的解耦和重用,同时提高代码的可读性和可维护性。例如:
interface Person {name: string;age?: number; // 可选属性greet(): void; // 方法签名
}
class Student implements Person {name: string;age: number;constructor(name: string, age: number) {this.name = name;this.age = age;}greet(): void {console.log("Hello, my name is " + this.name);}
}
联合类型(Union Types)是TypeScript中的一个特性,它允许一个变量有多种类型。联合类型通过竖线(|
)分隔每个类型来定义。例如,一个变量可以是字符串或数字类型:
let id: number | string;
id = 123; // 正确
id = "abc"; // 正确
类型断言(Type Assertion)是TypeScript中的一个特性,它允许开发者显式地指定一个变量的类型。类型断言不会进行类型检查,而是告诉编译器将变量视为特定的类型。类型断言有两种形式:尖括号形式(<类型>值
)和as
形式(值 as 类型
)。例如:
let someValue: any = "Hello World";
let strLength1: number = (<string>someValue).length; // 尖括号形式
let strLength2: number = (someValue as string).length; // as形式
在TypeScript中,定义函数的返回类型很简单,只需在函数签名中的参数列表后面添加:
和返回类型的名称即可。例如:
function greet(name: string): string {return
Hello, ${name}!
;
}
元组是TypeScript中的一个特性,它允许表示一个已知元素数量和类型的数组。元组的每个元素都有固定的类型,并且这些类型不必相同。元组类型通过方括号[]
和逗号,
分隔的类型列表来定义。例如:
let person: [string, number] = ["John Doe", 30];
枚举是TypeScript中的一个特性,它允许为一组相关的值定义一个名称。枚举类型使得代码更加清晰和易于理解。枚举成员具有一个隐式的数字值(从0开始递增),除非显式地指定了其他值。例如:
enum Color {Red,Green,Blue
}
let favoriteColor: Color = Color.Green;
TypeScript模块提供了一种将代码封装到不同文件中以组织和重用代码的方法。模块可以导出和导入到其他文件中,从而更容易跨多个文件和项目重用代码。TypeScript支持多种模块规范,如CommonJS、AMD、ES6模块等。使用
import
和
export
关键字可以导入和导出模块的功能。例如:
// math.ts
export function add(a: number, b: number): number {return a + b;
}// main.ts
import { add } from './math';
console.log(add(1, 2)); // 输出: 3
中级面试题
泛型,从字面上理解,就是一般的、广泛的的意思。在TypeScript中,泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体类型,而是在使用的时候再指定类型的一种特性。泛型中的T就像一个占位符或者说一个变量,在使用的时候可以把定义的类型像参数一样传入,它可以原封不动地输出。泛型在成员之间提供有意义的约束,这些成员可以是函数参数、函数返回值、类的实例成员、类的方法等。
在TypeScript中,类的定义方式和ES6的class基本相同。以下是一个简单的例子:
class Person {name: string = "word";getName(): void {console.log(this.name);}
}
const p1 = new Person();
p1.name = "hello";
p1.getName(); // 输出 "hello"
在这个例子中,我们定义了一个Person类,该类有一个name属性和一个getName()方法。我们可以实例化这个类并修改实例的属性值,然后调用getName()方法。
在TypeScript中,接口(Interfaces)是支持单继承的,即一个接口可以继承自另一个接口。使用extends关键字来定义接口的继承关系。以下是一个单继承的示例:
interface Animal {name: string;eat(): void;
}
interface Dog extends Animal {bark(): void;
}
let myDog: Dog = {name: 'Buddy',eat() { console.log('Dog is eating'); },bark() { console.log('Woof woof!'); }
};
在这个例子中,Dog接口继承了Animal接口,并添加了bark方法。任何实现Dog接口的对象都必须实现name、eat和bark这三个属性和方法。
当我们在TypeScript中声明变量但没有明确指定其类型时,TypeScript会尝试根据变量的值进行类型推断。这样可以帮助我们避免手动指定所有类型,使代码更简洁,同时也提供了更好的类型安全性。以下是一些关于类型推断的例子:
let x = 10; // TypeScript 推断 x 为 number 类型
let y = "hello"; // TypeScript 推断 y 为 string 类型
let z = true; // TypeScript 推断 z 为 boolean 类型
TypeScript中的交叉类型(Intersection Types)是通过&符号将多个类型进行合并成一个类型。交叉类型允许我们将多个类型合并为一个类型,从而可以创建一个具有多个类型特性的对象。以下是一个例子:
interface ClassA {name: string;age: number;
}
interface ClassB {name: string;phone: number;
}
type Class = ClassA & ClassB;
let info: Class = {name: 'zhangsan',age: 18,phone: 15738755555
};
需要注意的是,如果合并的接口类型中具有同名属性,且类型不同,则合并后类型为never。
映射类型(Mapped Types)是TypeScript中的一种高级类型,它允许我们基于一个已存在的类型来创建一个新的类型。映射类型通过遍历一个对象的所有属性,并对每个属性应用一个函数来生成新的属性,从而创建一个新的类型。以下是一个简单的例子:
type Keys = 'a' | 'b' | 'c';
type MappedType = { [P in Keys]: boolean };
在这个例子中,我们定义了一个Keys类型,它是一个字符串字面量类型。然后,我们使用映射类型来创建一个新的类型MappedType,它包含Keys中每个键的布尔值属性。
条件类型(Conditional Types)是TypeScript中的一种类型操作,它允许我们根据一个条件表达式来选择两个类型中的一个。条件类型使用三元运算符的语法,以下是一个简单的例子:
type Message<T> = T extends string ? string : number;
let msg1: Message<string> = "Hello"; // 正确,类型为string
let msg2: Message<number> = 123; // 正确,类型为number
在这个例子中,我们定义了一个条件类型Message,它根据泛型T的类型来选择string或number类型。
命名空间(Namespace)是TypeScript中用于组织代码的一种方式,它允许我们将相关的代码(变量、函数、类等)组织在一起,从而避免命名冲突。以下是一个简单的例子:
namespace Validation {export interface StringValidator {isAcceptable(s: string): boolean;}export class LettersOnlyValidator implements StringValidator {isAcceptable(s: string): boolean {return /^[A-Za-z]+$/.test(s);}}
}
// 使用命名空间中的类和接口
let validator = new Validation.LettersOnlyValidator();
console.log(validator.isAcceptable("Hello")); // 输出 true
模块和命名空间都是TypeScript中用于组织代码的方式,但它们有一些关键的区别:
- 模块是ES6引入的一个概念,它允许我们将代码分割成可重用的单元。模块之间的依赖关系是通过import和export语句来管理的。
- 命名空间是TypeScript特有的一个概念,它提供了一种将代码组织成层次结构的方式,以避免命名冲突。命名空间通过namespace关键字来定义。
模块和命名空间的主要区别在于它们的定义方式和使用场景。模块更适用于大型项目的代码组织,而命名空间则更适用于小型项目或库的内部代码组织。
装饰器(Decorators)是TypeScript中的一个实验性特性,它允许我们修改类、方法或属性的行为。装饰器使用@expression这种语法来应用。以下是一个简单的例子:
function log(target: any, propertyName: string, descriptor: PropertyDescriptor) {const originalMethod = descriptor.value;descriptor.value = function (...args: any[]) {console.log(
Calling ${propertyName} with args: ${args}
);const result = originalMethod.apply(this, args);console.log(
${propertyName} returned: ${result}
);return result;};return descriptor;
}
class Calculator {@logadd(a: number, b: number): number {return a + b;}
}
const calc = new Calculator();
calc.add(2, 3); // 输出调用信息和返回值
在这个例子中,我们定义了一个log装饰器,它会在调用被装饰的方法之前和之后打印日志信息。然后,我们在Calculator类的add方法上应用了这个装饰器。
请注意,由于装饰器目前仍然是TypeScript的实验性特性,因此在使用时可能需要配置TypeScript编译器以支持该特性。
高级面试题
高级类型(Advanced Types)是TypeScript中为了增加语言的灵活性和表达能力而引入的一些特殊类型。这些高级类型允许开发者定义更具体、更复杂的类型,从而更好地描述数据和函数的行为。TypeScript中的高级类型包括但不限于:
- **字面量****类型(**Literal Types):字面量不仅可以表示值,还可以表示类型。例如,字符串字面量类型允许指定一个具体的字符串值作为类型。
- 联合类型(Union Types):表示一个值可以是几种类型之一,使用“|”分隔每个类型。
- 交叉类型(Intersection Types):将多个类型合并为一个类型,它包含了所有类型的成员。
- 索引类型:允许定义对象的索引签名,即对象可以有的属性和它们的类型。
- 条件类型:根据条件返回不同的类型,它们使用条件语句的结构,但使用类型语法。
- 类型推断(Type Inference):TypeScript可以自动推断变量的类型,而无需显式声明。
此外,还有类型别名、映射类型、泛型等高级类型特性,这些特性使得TypeScript成为一种强大的静态类型系统,能够帮助编写更健壮、更易于维护的代码。
类型守卫(Type Guards)是TypeScript中的一种特殊表达式,它们可以在运行时检查一个值是否具有特定类型。类型守卫通常与typeof
、instanceof
等操作符结合使用,或者通过自定义函数来实现。以下是几种常见的类型守卫使用方式:
- typeof****类型守卫:用于确定变量的类型,但功能有限,只能确定JavaScript能识别的类型(如Boolean、String、Number等)。
- instanceof****类型守卫:用于检查一个值是否是给定构造函数或类的实例。这对于确定实例类型的类型很有用。
- in****类型守卫:检查对象是否具有特定的属性,并使用该属性区分不同的类型。
- 自定义类型守卫:通过自己编写函数来创建自定义类型保护,可以检查的内容没有限制,但需要确保精度以避免错误。
反射(Reflection)是一种在运行时获取和操作类型及其成员的能力。在TypeScript中,可以使用反射来获取类的构造函数、属性、方法等信息,并进行动态的操作。例如,可以使用typeof
来获取类的构造函数,使用Object.getOwnPropertyNames
来获取类的属性和方法。反射是一种强大的工具,但也需要谨慎使用,以避免过度依赖反射导致代码可读性和维护性的下降。
TypeScript中的类型操纵技巧多种多样,包括但不限于以下几种:
- 类型别名(Type Aliases):为类型起一个新名字,以便更简洁地引用它们。
- 条件类型:根据条件返回不同的类型,允许在类型级别进行条件判断。
- 映射类型:基于一个已存在的类型来创建新的类型,新的类型将具有与原类型相同的键,但每个键对应的类型由提供的函数来定义。
- 递归****类型别名:允许定义引用自身的类型,这在处理树状结构或嵌套数据时特别有用。
- 字符串文字插值类型:允许基于其他类型的动态创建字符串文本类型,这在处理事件系统或在整个代码库中创建一致的命名约定时特别有用。
依赖注入(Dependency Injection)是一种设计模式,用于实现控制反转(Inversion of Control),即类的依赖关系由外部容器来管理,而不是在类内部创建依赖对象。在TypeScript中实现依赖注入通常涉及以下几个步骤:
- 定义一个容器:用于管理对象的生命周期和依赖关系。
- 标记可被注入的类:通过某种机制(如装饰器或注解)标记哪些类可以被容器注入。
- 配置依赖关系:在容器中配置类的依赖关系。
- 获取实例:从容器中获取类的实例,容器会自动处理依赖注入。
在实际应用中,可以使用第三方库(如InversifyJS)来实现依赖注入,这些库提供了更强大和灵活的功能。
混入(Mixins)是一种将多个类的行为组合到一个类中的技术。在TypeScript中,可以通过使用类型别名、交叉类型、装饰器等技术来实现混入。以下是一个使用类型别名和交叉类型实现混入的简单示例:
type Constructor<T> = new (...args: any[]) => T;
function Mixin<TBase extends Constructor<{}>, TMixin extends Constructor<{}>>(base: TBase, mixin: TMixin): Constructor<TBase & InstanceType<TMixin>> {return class extends base implements InstanceType<TMixin> {constructor(...args: any[]) {super(...args);Object.assign(this, new mixin(...(args as any)));}} as any;
}
class A {foo() {console.log('foo from A');}
}
class B {bar() {console.log('bar from B');}
}
const AB = Mixin(A, B);
const ab = new AB();
ab.foo(); // 输出: foo from A
ab.bar(); // 输出: bar from B
在这个示例中,Mixin
函数接受两个构造函数作为参数,并返回一个新的构造函数。这个新的构造函数创建的实例将同时拥有两个原始类的行为。
类型保护(Type Protection)与类型守卫类似,都是用于在运行时检查一个值是否具有特定类型。类型保护通常通过自定义函数来实现,这些函数返回一个布尔值来表示检查是否成功。与类型守卫不同的是,类型保护更侧重于在函数内部对类型进行断言,而不是在条件语句中。以下是一个使用类型保护的示例:
function isString(value: any): value is string {return typeof value === 'string';
}
function processValue(value: any) {if (isString(value)) {// 在这里,TypeScript知道value是string类型console.log(value.toUpperCase());} else {// 处理其他类型console.log(value);}
}
在这个示例中,isString
函数是一个类型保护函数,它返回一个布尔值来表示给定的值是否是字符串类型。在processValue
函数中,可以使用这个类型保护函数来检查值的类型,并在类型确定的情况下执行相应的操作。
TypeScript中的模块解析策略是指编译器如何查找和解析模块的位置。TypeScript支持多种模块解析策略,包括经典解析策略(Classic)和Node.js解析策略(Node)。
- 经典解析策略:在这种策略下,TypeScript编译器会按照一个相对简单的规则来解析模块。它会首先在当前文件所在目录下查找模块文件(如
.ts
、.tsx
、.d.ts
等),如果没有找到,则会在编译选项中的baseUrl
指定的目录下查找,或者回退到全局模块查找。 - Node.js解析策略:这是TypeScript默认的模块解析策略。它遵循Node.js的模块解析机制,包括查找
node_modules
目录、解析package.json
中的main
字段、查找index.js
等默认文件等。此外,TypeScript还支持通过paths
和baseUrl
编译选项来自定义模块解析路径。
装饰器(Decorators)是TypeScript中的一个实验性特性,它允许你通过声明式的方式修改类和类成员的行为。装饰器是一种特殊类型的声明,它能够被附加到类声明、方法、访问器、属性或参数上。装饰器使用@expression
这种形式,expression
必须求值为一个函数,它会在运行时被调用,被装饰的声明信息作为参数传入。
以下是一个使用装饰器的示例:
function log(target: any, propertyName: string, descriptor: PropertyDescriptor) {const originalMethod = descriptor.value;descriptor.value = function (...args: any[]) {console.log(
Calling ${propertyName} with args:
, args);const result = originalMethod.apply(this, args);console.log(
${propertyName} returned:
, result);return result;};return descriptor;
}
class Calculator {@logadd(a: number, b: number): number {return a + b;}
}
const calc = new Calculator();
calc.add(2, 3); // 输出调用和返回信息
在这个示例中,log
是一个装饰器函数,它会被附加到Calculator
类的add
方法上。当调用add
方法时,装饰器函数会先执行,打印出调用信息和返回值信息。
在TypeScript中处理异步编程主要依赖于JavaScript的异步特性,但TypeScript提供了更强大的类型检查和智能提示功能来增强异步代码的可读性和安全性。以下是几种在TypeScript中处理异步编程的主要方式:
- 回调函数**(Callbacks)**:虽然在现代JavaScript/TypeScript开发中,回调函数已经较少作为首选的异步处理方式,但它们仍然是理解异步编程的基础。回调函数是一个作为参数传递给另一个函数的函数,这个被传递的函数将在某个异步操作完成后被调用。
function fetchData(callback: (data: string) => void) {setTimeout(() => {const data = "Fetched Data";callback(data);}, 1000);
}
fetchData((data) => {console.log(data);
});
在TypeScript中,你可以为回调函数指定参数和返回值的类型。
- Promises:Promises是处理异步操作更现代、更优雅的方式。它们代表了一个异步操作的最终完成(或失败)及其结果值。
function fetchData(): Promise<string> {return new Promise((resolve, reject) => {setTimeout(() => {const success = true; // 模拟成功或失败的条件if (success) {resolve("Fetched Data");} else {reject(new Error("Failed to fetch data"));}}, 1000);});
}
fetchData().then(data => {console.log(data);}).catch(error => {console.error(error);});
在TypeScript中,你可以为Promise指定它解析(resolve)值的类型。
- async/await:async/await是基于Promises的语法糖,它使得异步代码看起来和同步代码非常相似,从而更容易理解和维护。
async function fetchData(): Promise<string> {return new Promise((resolve, reject) => {setTimeout(() => {const success = true; // 模拟成功或失败的条件if (success) {resolve("Fetched Data");} else {reject(new Error("Failed to fetch data"));}}, 1000);});
}
async function getData() {try {const data = await fetchData();console.log(data);} catch (error) {console.error(error);}
}
getData();
使用async关键字声明的函数总是返回一个Promise。在函数内部,你可以使用await关键字等待一个Promise完成,并获取其结果。await只能在async函数内部使用。
相关文章:
TypeScript面试题集合【初级、中级、高级】
初级面试题 什么是TypeScript? TypeScript是JavaScript的超集,由Microsoft开发,它添加了可选的静态类型和基于类的面向对象编程。TypeScript旨在解决JavaScript的某些局限性,比如缺乏静态类型和基于类的面向对象编程,…...
java面试篇 并发编程篇
目录 1.线程的基础知识 1.线程与进程的区别? 2.并行与并发的区别? 3.创建线程的方式有哪些? 4.线程包括哪些状态?状态之间是如何变化的? 5.T1,T2,T3三个线程新建完毕后,如何保证…...
掌握 JSON 到表格转换:全面指南
高效地转换数据格式对于现代数据处理至关重要。JSON(JavaScript 对象表示法)因其灵活性而广受欢迎,而 CSV 或 Excel 等表格格式则更适用于数据分析和可视化。本文将介绍多种 JSON 转换为表格格式的方法,帮助您提升数据处理和可视化…...
【Spring Cloud Netflix】GateWay服务网关
1.基本概述 GateWay用于在微服务架构中提供统一的入口点,对请求进行路由,过滤和处理。它就像是整个微服务系统的大门,所有外部请求都要通过它才能访问到后端的各个微服务。 2.核心概念 2.1路由(Route) 路由是Spring Cloud gateWay中最基本…...
国产芯片解析:龙讯USB Type-C/DP Transmitter多场景覆盖,定义高速互联新标杆
在智能设备功能日益复杂化的今天,高速数据传输、高清视频输出与多功能接口融合已成为行业刚需。龙讯半导体(Lontium)凭借其领先的芯片设计能力,推出多款USB Type-C/DP Transmitter芯片,覆盖从消费电子到工业应用的…...
蓝桥杯 web 展开你的扇子(css3)
普通答案: #box:hover #item1{transform: rotate(-60deg); } #box:hover #item2{transform: rotate(-50deg); } #box:hover #item3{transform: rotate(-40deg); } #box:hover #item4{transform: rotate(-30deg); } #box:hover #item5{transform: rotate(-20deg); }…...
【Kubernetes】StorageClass 的作用是什么?如何实现动态存储供应?
StorageClass 使得用户能够根据不同的存储需求动态地申请和管理存储资源。 StorageClass 定义了如何创建存储资源,并指定了存储供应的配置,例如存储类型、质量、访问模式等。为动态存储供应提供了基础,使得 Kubernetes 可以在用户创建 PVC 时…...
4月7号.
双列集合的特点: Map中的常见API: //1.创建Map集合的对象 Map<String, String> m new HashMap<>();//2.添加元素 Stringvalue1 m.put("郭靖","黄蓉"); System.out.println(value1); m.put("韦小宝","沐剑屏"); m.put(&q…...
C++抽卡模拟器
近日在学校无聊,写了个抽卡模拟器供大家娱乐。 代码实现以下功能:抽卡界面,抽卡判定、动画播放、存档。 1.抽卡界面及判定 技术有限,不可能做的和原神一样精致。代码如下(注:这不是完整代码,…...
蓝桥杯 2. 开赛主题曲【算法赛】
2.开赛主题曲【算法赛】 - 蓝桥云课 这道题和3. 无重复字符的最长子串 - 力扣(LeetCode)类似,因为题目中规定只有小写字母,所以定义统计数组时只需要定义26个字母即可,然后每次遍历的字符减去‘a’即为他的下标 impo…...
Spring Boot 中的 Bean
2025/4/6 向全栈工程师迈进! 一、Bean的扫描 在之前,对于Bean的扫描,我们可以在XML文件中书写标签,来指定要扫描的包路径,如下所示,可以实通过如下标签的方式: <context:component-scan base-package&…...
基于springboot科研论文检索系统的设计(源码+lw+部署文档+讲解),源码可白嫖!
摘要 随着我国经济的高速发展与人们生活水平的日益提高,人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下,人们更趋向于足不出户解决生活上的问题,线上管理系统展现了其蓬勃生命力和广阔的前景。与此同时,在此…...
Mysql入门
一、数据库三层结构 所谓安装Mysql数据库,就是在主机安装一个数据库管理系统(DBMS),这个管理程序可以管理多个数据库。DBMS(database manage system)一个数据库中可以创建多个表,以保存数据(信息)。数据库管理系统(DBMS)、数据库和表的关系如…...
如何解决uniapp打包安卓只出现功能栏而无数据的问题
如何解决uniapp打包安卓只出现功能栏而无数据的问题 经验来自:关于Vue3中调试APP触发异常:exception:white screen cause create instanceContext failed,check js stack -> at useStore (app-service.js:2309:15)解决方案 - 甲辰哥来帮你算命 - 博客…...
Python高级爬虫之JS逆向+安卓逆向1.1节-搭建Python开发环境
目录 引言: 1.1.1 为什么要安装Python? 1.1.2 下载Python解释器 1.1.3 安装Python解释器 1.1.4 测试是否安装成功 1.1.5 跟大神学高级爬虫安卓逆向 引言: 大神薯条老师的高级爬虫安卓逆向教程: 这套爬虫教程会系统讲解爬虫的初级&…...
剖析Mybatis中用到的设计模式
框架对很多设计模式的实现,都并非标准的代码实现,都做了比较多的自我改进。实际上,这就是所谓的灵活应用, 只借鉴不照搬, 根据具体问题针对性地去解决。 涉及到Mybatis源码知识和设计模式,这点我之前的博客均有涉及。 可以查看我的…...
MySQL 函数(入门版)
目录 一、字符串函数 1、常用的字符串函数 2、函数演示 3、具体案例 二、数值函数 1、常用的数值函数 2、函数演示 3、具体案例 三、日期函数 1、常用的日期函数 2、函数演示 3、具体案例 四、流程函数 1、常用的流程函数 2、函数演示 3、具体案例 在MySQL中&a…...
d202546
目录 一、罗马字符转数字 二、二叉树的右视图 三、sql-查询结果的质量和占比 一、罗马字符转数字 首先把两个字符组成一个数字做一下单独判断 然后就是单个字符转数字 public int romanToInt(String s) {int sum 0;char[] ch s.toCharArray();int i 0;while(i < ch.len…...
洛谷每日1题-------Day37__P1634 禽兽的传染病
题目背景 mxj 的启发。 题目描述 禽兽患传染病了。一个禽兽会每轮传染 x 个禽兽。试问 n 轮传染后有多少禽兽被传染? 输入格式 两个非负整数 x 和 n。 输出格式 一个整数,即被传染的禽兽数。 输入输出样例 输入 #1复制 10 2 输出 #1复制 121…...
c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第五式】动态内存管理
c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第五式】动态内存管理 【心法】 【第零章】c语言概述 【第一章】分支与循环语句 【第二章】函数 【第三章】数组 【第四章】操作符 【第五章】指针 【第六章】结构体 【第七章】const与c语言中一些错误代码 【禁忌秘术】 【第一式…...
理解进程和线程的概念
在操作系统中,进程和线程都是执行的基本单位,但它们在性质和管理方面有所不同 进程 定义: 进程是一个正在运行的程序的实例,是操作系统资源分配的基本单位。特点: 独立性:每个进程有其独立的内存空间、数据栈和其他辅助数据。重…...
【项目管理】第2章 信息技术发展 --知识点整理
Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 对应:第1章-第5章 (二)知识笔记 二、信息技术的发展 1. 信息技术及其发展 1)计算机软硬件 计算机硬件由电子机械、光电元件等组成的物理装置,提供物质基础给计算机软件运行。软件包括程…...
docker部署rabbitmq
拉取镜像 docker pull rabbitmq:managementmanagement 标签表示包含管理插件,可以通过 Web 界面管理 RabbitMQ 启动容器 docker run --restartalways -d --name rabbitmq \-p 9004:5672 -p 9005:15672 \-e RABBITMQ_DEFAULT_USERrabbitmq \-e RABBITMQ_DEFAULT_P…...
手搓多模态-03 顶层和嵌入层的搭建
声明:本代码非原创,是博主跟着国外大佬的视频教程编写的,本博客主要为记录学习成果所用。 我们首先开始编写视觉模型这一部分,这一部分的主要功能是接收一个batch的图像,并将其转化为上下文相关的嵌入向量,…...
计算机系统---UEFI(统一可扩展固件接口)
一、UEFI定义与历史背景 UEFI(Unified Extensible Firmware Interface) 是替代传统BIOS的新一代固件接口标准,由UEFI论坛(前身是Intel的EFI论坛)制定,旨在解决BIOS在现代硬件和操作系统下的局限性。 设计…...
2025年渗透测试面试题总结-某四字大厂面试复盘扩展 二面 (题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 某四字大厂面试复盘 二面 一、文件上传绕过WAF的15种深度技巧 二、SSRF利用与WAF绕过的8种高阶手法 …...
基于BP神经网络的杂草智能识别系统(杂草识别、Python项目)
基于BP神经网络的杂草智能识别系统 项目介绍 本项目是一个基于PyQt5和BP神经网络的杂草智能识别系统。系统通过图像处理和神经网络技术, 能够识别8种不同的杂草类别。用户可以通过上传图片,系统会自动识别图片中的杂草类别,并显示识别结果和…...
Java的Selenium的特殊元素操作与定位之时间日期控件
分为两种情况: 控件没有限制手动输入,则直接调用sendKeys方法写入时间数据 //时间日期控件处理 chromeDriver.get ("https://www,fliggy,com/?ttidsem.000000736&hlreferidbaidu.082076&route sourceseo"); chromeDriver.findElement (By.xpat…...
深入理解矩阵乘积的导数:以线性回归损失函数为例
深入理解矩阵乘积的导数:以线性回归损失函数为例 在机器学习和数据分析领域,矩阵微积分扮演着至关重要的角色。特别是当我们涉及到优化问题,如最小化损失函数时,对矩阵表达式求导变得必不可少。本文将通过一个具体的例子——线性…...
基于大数据的美团外卖数据可视化分析系统
【大数据】基于大数据的美团外卖数据可视化分析系统 (完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统通过对海量外卖数据的深度挖掘与分析,能够为美团外卖平台提供运营决策支…...
TypeScript 类型系统详解
基础类型 TypeScript 支持丰富的基础数据类型,涵盖number、string、boolean、null、undefined、symbol以及bigint。这些类型为构建可靠的代码提供了基石。 数值类型(number):在 TypeScript 里,所有数字均为浮点数…...
【学Rust写CAD】33 近似 Alpha 混合函数(argb.rs补充方法)
源码 #[inline]pub fn over(self, dst: Argb) -> Argb {let a 256 - self.alpha32();let rb (dst.rb() * a) >> 8;let ag dst.ag() * a;Argb(self.0 (rb & Argb::MASK) | (ag & !Argb::MASK))}源码分析 这段代码实现了一个近似 Alpha 混合(“…...
4.3-4.6学习总结 Java:Set系列集合+双列集合+Map
Set系列集合: 元素是唯一的。 HashSet: 哈希值: 如果没有重写hashcode方法和equals方法,那么哈希值是根据地址值计算的。 LinkedHashSet: TreeSet底层为红黑树。 红黑树:两个红色节点不能相连。 双列集合&…...
深信服护网蓝初面试题
《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...
2011-2019年各省地方财政商业服务业等事务支出数据
2011-2019年各省地方财政商业服务业等事务支出数据 1、时间:2007-2019年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区、年份、地方财政商业服务业等事务支出 4、范围:31省 5、指标说明:地方财政在商…...
InfoSec Prep: OSCP靶场渗透
InfoSec Prep: OSCP InfoSec Prep: OSCP ~ VulnHubInfoSec Prep: OSCP, made by FalconSpy. Download & walkthrough links are available.https://www.vulnhub.com/entry/infosec-prep-oscp,508/ 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做…...
【Kubernetes】Kubernetes 如何管理存储?PV 和 PVC 是如何工作的?
在 Kubernetes 中,存储管理是通过 Persistent Volume (PV) 和 Persistent Volume Claim (PVC) 来实现的。 它们为容器化应用提供持久化存储,使得应用在重启或重新调度时仍然能够访问数据。 1. 存储管理概述 Kubernetes 的存储管理是基于 持久化卷 (Pe…...
CasaOS小主机本地安装1Panel运维面板结合内网穿透移动端远程运维
文章目录 前言1. 添加镜像源2. 部署1Panel3. 本地访问测试4. 安装内网穿透工具5. 配置公网地址6. 配置固定公网地址 前言 小伙伴们,是不是一想到要远程管理服务器就头大如斗?特别是没有公网IP或路由器设置复杂时,简直让人抓狂!但…...
BGP路由协议之属性2
Orgin 起源 公认必遵属性 起源名称标记描述IGPi如果路由是由始发的 BGP 路由器使用 network 命令注入到 BGP 的,那么该 BGP 路由的 origin 属性为 IGPEGPe如果路由是通过 EGP 学习到的,那么该 BGP 路由的 Origin 属性为 EGPIncomplete?如果路由是通过…...
HttpClient(笔记)
介绍: 发送请求的步骤: 发送get类型的请求: 发送post类型的请求:...
【简历全景认知】简历的历史演变与当代定位:从羊皮卷到算法博弈的艺术
引言:时间维度下的求职凭证。 当古埃及工匠在莎草纸上记录自己的技能时,他们不会想到这份"技能清单"会在四千年后演变成LinkedIn上的数字档案。简历作为个人职业身份的载体,其演变史就是一部微观的人力资源配置史。从手写推荐信到ATS系统解析的PDF,每一次形式变…...
ERP系统五大生产模式概述
制造业中,选择合适的生产模式是企业高效运营的关键。 以下是ERP系统支持的五大核心生产模式及其特点总结: 1. MTS(按库存生产) - 定义:先生产后销售,基于需求预测提前备货。 - 适用场景:需求稳定、标准化程度高的产品(如日用品、家电)。 - 优点:交货快、生产…...
003 vue生命周期和钩子函数
文章目录 1.Vue实例有一个完整的生命周期,也就是说从开始创建、初始化数据、编译模板、挂载DOM、渲染-更新-渲染、卸载等一系列过程,称之为Vue实例的生命周期 2.钩子函数(监听函数):Vue实例在完整的生命周期过程中&…...
学透Spring Boot — 016. 魔术师 - Spring MVC Conversion Service 类型转换
本文是我的《学透Spring Boot》专栏的第16篇文章,了解更多请移步我的专栏: Postnull的专栏《学透Spring Boot》 目录 遇到问题 日期格式的转换 实现需求 创建转换器 注册转换器 编写Controller 访问测试 存在的问题 解决问题 源码分析 总结 …...
Ubuntu 22 Linux上部署DeepSeek R1保姆式操作详解(Xinference方式)
一、安装步骤 1.基础环境安装 安装显卡驱动、cuda,根据自己硬件情况查找相应编号,本篇不介绍这部分内容,只给出参考指令,详情请读者自行查阅互联网其它参考资料。 sudo apt install nvidia-utils-565-server sudo apt install…...
C语言查漏补缺:占位符篇
占位符篇 1. 整数类型2. 字符类型3. 浮点数类型4. 指针类型5. 字符串6. 修饰符 1. 整数类型 %d / %i:用于 int(有符号十进制整数)。int num -42; printf("%d", num); // 输出: -42%u:用于 unsigned int(无…...
springcloud现常用的组件都有哪些,如何使用
Spring Cloud是一个用于构建分布式系统的开源框架,它提供了多个常用的组件来简化分布式系统的开发和部署。以下是Spring Cloud中常用的一些组件: Spring Cloud Config:用于集中式管理配置,并提供配置的动态刷新功能。Spring Clou…...
Vue3响应式引擎解密:从依赖追踪到性能调优的深度之旅
一、响应式内核架构演进 1.1 响应式范式升级 1.2 新旧架构性能对比 操作类型Vue2(ms)Vue3(ms)提升幅度深对象初始化8502203.86x数组操作响应120186.67x嵌套属性访问340655.23x批量更新响应210326.56x 二、依赖追踪机制剖析 2.1 依赖收集实战案例 // 数据模型const state r…...
主流程发起,去除子流程的时长计算问题
问题: 有三个流程,流程1.2.3,流程2.3是流程1的子流程,若在流程1的过程中发起流程2.3,计算流程1的时长要排除流程2.3的时间,流程2.3之间可能是包含、交集、无交集三种。 实现 代码: import jav…...
Java 8 到 Java 21 系列之 新日期时间API:精确的时间管理(Java 8)
Java 8 到 Java 21 系列之 新日期时间API:精确的时间管理(Java 8) 系列目录 Java8 到 Java21 系列之 Lambda 表达式:函数式编程的开端(Java 8)Java 8 到 Java 21 系列之 Stream API:数据处理的…...