TypeScript入门 (一)数据类型与运算符

news2024/11/16 10:30:24

head-bar

引言

大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的TypeScript学习总结文档。希望通过我的知识点总结,能够帮助你更好地学习TypeScript。💕💕😊


一、介绍:

1.什么是 TypeScript?

TypeScript 是一种由微软开发的开源编程语言,它是 JavaScript 的超集,意味着任何有效的 JavaScript 代码也是有效的 TypeScript 代码。TypeScript 在 JavaScript 的基础上增加了静态类型检查、类、接口、模块等特性,使得开发者可以在编写代码时更早地发现错误,提高代码的可维护性和可读性。

应用场景:

  • 大型项目开发
  • 团队协作
  • 需要强类型检查的场景

代码示例:

// 定义一个接口来描述用户对象的结构
interface User {
    id: number;
    name: string;
    email: string;
    isAdmin: boolean;
}

// 定义一个类来表示用户
class UserService {
    private users: User[] = [];

    // 添加用户
    addUser(user: User): void {
        this.users.push(user);
    }

    // 获取所有用户
    getUsers(): User[] {
        return this.users;
    }

    // 根据ID查找用户
    findUserById(id: number): User | undefined {
        return this.users.find(user => user.id === id);
    }

    // 删除用户
    deleteUser(id: number): void {
        this.users = this.users.filter(user => user.id !== id);
    }
}

// 创建一个 UserService 实例
const userService = new UserService();

// 添加一些用户
userService.addUser({ id: 1, name: "Alice", email: "alice@example.com", isAdmin: true });
userService.addUser({ id: 2, name: "Bob", email: "bob@example.com", isAdmin: false });

// 获取所有用户并打印
console.log("All Users:", userService.getUsers());

// 查找并打印特定用户
const user = userService.findUserById(1);
console.log("Found User:", user);

// 删除用户并打印剩余用户
userService.deleteUser(1);
console.log("Remaining Users:", userService.getUsers());

2.TypeScript 与 JavaScript 的区别

1. 类型系统

JavaScript:

  • 动态类型:变量类型在运行时确定。
  • 无显式类型声明。

TypeScript:

  • 静态类型:变量类型在编译时确定。
  • 显式类型声明:如 numberstringboolean 等。
  • 类型推断:支持类型推断,但鼓励显式声明。

示例:

// JavaScript
let age = 30;  // 类型推断为 number
age = "thirty";  // 类型可以改变

// TypeScript
let age: number = 30;  // 显式声明为 number 类型
// age = "thirty";  // 错误:不能将类型 "string" 分配给类型 "number"
2. 语法差异

JavaScript:

  • 函数声明:使用 function 关键字。
  • 类:ES6 引入,基于原型继承。
  • 模块:ES6 引入,使用 importexport关键字。

TypeScript:

  • 函数声明:支持显式声明参数和返回值类型。
  • 类:更强大的类支持,包括访问修饰符、只读属性、抽象类和接口。
  • 模块:支持 ES6 模块系统,提供更强大的模块声明和命名空间功能。

示例:

// JavaScript
function add(a, b) {
    return a + b;
}

// TypeScript,规定输入输出的格式
function add(a: number, b: number): number {
    return a + b;
}

class Person {
    private name: string;
    constructor(name: string) {
        this.name = name;
    }
    greet(): string {
        return `Hello, my name is ${this.name}`;
    }
}
  1. **<font style="color:rgb(60, 60, 67);background-color:rgb(247, 247, 247);">public</font>**: 默认访问修饰符,表示成员可以在类的内部和外部访问。
  2. **<font style="color:rgb(60, 60, 67);background-color:rgb(247, 247, 247);">private</font>**: 表示成员只能在类的内部访问,外部无法访问。
  3. **<font style="color:rgb(60, 60, 67);background-color:rgb(247, 247, 247);">protected</font>**: 表示成员可以在类的内部和子类中访问,外部无法访问。
  4. **<font style="color:rgb(60, 60, 67);background-color:rgb(247, 247, 247);">constructor</font>** 是类的构造函数,用于初始化对象的属性。
3. 编译过程

JavaScript:

  • 解释执行:代码由浏览器或 Node.js 解释执行。

TypeScript:

  • 编译执行:代码需通过 tsc 编译成 JavaScript 代码。
  • 类型检查:编译时进行类型检查,确保类型安全。

示例:

// TypeScript 代码
let message: string = "Hello, TypeScript!";
console.log(message);

// 编译后的 JavaScript 代码
let message = "Hello, TypeScript!";
console.log(message);
4. 应用场景

JavaScript:

  • 前端开发:构建动态网页和交互式用户界面。
  • 后端开发:Node.js 使用 JavaScript 进行后端开发。

TypeScript:

  • 大型项目:适用于需要强类型检查和代码可维护性的项目。
  • 团队协作:静态类型系统有助于团队协作,减少代码冲突和错误。
  • 现代前端框架:与 Angular、React、Vue.js 集成良好。

示例:

// JavaScript 前端代码
document.getElementById("demo").innerHTML = "Hello, JavaScript!";

// TypeScript 前端代码
let element: HTMLElement = document.getElementById("demo");
element.innerHTML = "Hello, TypeScript!";
5. 工具支持

JavaScript:

  • 开发工具:Chrome DevTools、Visual Studio Code 等。
  • 调试:直接在浏览器或 Node.js 中调试。

TypeScript:

  • 开发工具:与 Visual Studio Code 集成良好,提供强大的代码补全、重构和调试功能。
  • 调试:需编译成 JavaScript 后调试,但 IDE 提供丰富调试支持。

示例:

// TypeScript 代码
function greet(name: string): string {
    return `Hello, ${name}!`;
}

console.log(greet("TypeScript"));
6. 错误检查

JavaScript:

  • 运行时错误:错误通常在代码执行时才会被发现。

TypeScript:

  • 编译时错误:在编译时进行类型检查,减少运行时错误。

示例:

// JavaScript
function add(a, b) {
    return a + b;
}

console.log(add(1, "2"));  // 输出: "12",类型错误未被发现

// TypeScript
function add(a: number, b: number): number {
    return a + b;
}

// console.log(add(1, "2"));  // 错误:不能将类型 "string" 分配给类型 "number"
7. 模块化与代码组织

JavaScript:

  • 模块系统:ES6 引入,但模块化支持较弱。
  • 代码组织:依赖文件和模块,缺乏强类型支持。

TypeScript:

  • 模块系统:支持 ES6 模块系统,提供更强大的模块声明和命名空间功能。
  • 代码组织:类型系统和模块化支持使得代码组织更清晰和易于维护。

示例:

// JavaScript 模块
export function greet(name) {
    return `Hello, ${name}!`;
}

// TypeScript 模块
export function greet(name: string): string {
    return `Hello, ${name}!`;
}

通过这些简化的对比,可以一目了然地了解 TypeScript 与 JavaScript 的主要区别。TypeScript 通过引入静态类型检查和其他高级特性,显著提高了代码的健壮性和可维护性,特别适用于大型项目和团队协作开发。

3.为什么选择 TypeScript?

选择 TypeScript 的原因有很多,主要包括以下几点:

  1. 静态类型检查: TypeScript 提供了静态类型检查,可以在编写代码时发现潜在的错误,减少运行时错误。
  2. 更好的代码可维护性: 类型系统使得代码更易于理解和维护,特别是在大型项目中。
  3. 现代语言特性: TypeScript 支持 ES6+ 的许多新特性,如类、模块、箭头函数等。
  4. 强大的工具支持: TypeScript 与现代 IDE(如 Visual Studio Code)集成良好,提供了强大的代码补全、重构和调试功能。

应用场景:

  • 大型前端项目
  • 需要强类型检查的后端项目
  • 团队协作开发

代码示例:

// TypeScript 代码
function add(a: number, b: number): number {
    return a + b;
}

console.log(add(1, 2));  // 输出: 3

4.TypeScript 的安装与环境配置

要开始使用 TypeScript,首先需要在开发环境中安装 TypeScript 编译器(tsc)。TypeScript 编译器可以将 TypeScript 代码编译成 JavaScript 代码。

安装步骤:

  1. 安装 Node.js: TypeScript 依赖于 Node.js 环境,因此首先需要安装 Node.js。可以从 Node.js 官网 下载并安装。
  2. 安装 TypeScript: 使用 Node.js 的包管理工具 npm 安装 TypeScript。
npm install -g typescript
  1. 验证安装: 安装完成后,可以通过以下命令验证 TypeScript 是否安装成功。
tsc --version

环境配置:

  1. 创建 TypeScript 项目: 创建一个新的项目文件夹,并在其中初始化 npm 项目。
mkdir test
cd test
npm init -y

  1. 配置 TypeScript: 在项目根目录下创建一个 tsconfig.json 文件,用于配置 TypeScript 编译选项。
{
  "compilerOptions": {
    "target": "ES6",
    "module": "commonjs",
    "strict": true,
    "outDir": "./dist",
    "rootDir": "./src"
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}
  1. 编写 TypeScript 代码: 在 src 目录下创建 TypeScript 文件(如 index.ts),并编写代码。
// src/index.ts
let message: string = "Hello, TypeScript!";
console.log(message);
  1. 编译 TypeScript 代码: 使用 tsc 命令编译 TypeScript 代码。
tsc

编译后的 JavaScript 代码将生成在 dist 目录下。

  1. 运行 JavaScript 代码: 使用 Node.js 运行编译后的 JavaScript 代码。
node dist/index.js

  • tsconfig.json 文件配置了 TypeScript 编译器的选项,如目标 ECMAScript 版本、模块系统、输出目录等。
  • tsc 命令将 TypeScript 代码编译成 JavaScript 代码,并输出到 dist 目录。
  • node 命令用于运行编译后的 JavaScript 代码。

二 、TypeScript 基础语法

1. 变量声明与数据类型

①基本数据类型

在 TypeScript 中,数据类型是确保代码健壮性和可维护性的关键。了解这些基本数据类型及其应用场景,可以帮助开发者在编写代码时避免许多常见的错误。

number

介绍:
number 类型用于表示整数和浮点数。与 JavaScript 不同,TypeScript 中没有 intfloat 的区分,所有数字都是 number 类型。

应用场景:

  • 计算、计数、索引等数值操作。

代码示例:

let age: number = 25;
let price: number = 19.99;

console.log(age);  // 输出: 25
console.log(price);  // 输出: 19.99

解读:

  • age 是一个整数,price 是一个浮点数。
  • TypeScript 会自动推断 ageprice 的类型为 number
string

介绍:
string 类型用于表示文本数据。可以使用单引号(')、双引号(")或反引号(`)来定义字符串。

应用场景:

  • 用户输入、文本处理、日志记录等。

代码示例:

let greeting: string = "Hello, TypeScript!";
let message: string = `Welcome to ${greeting}`;

console.log(greeting);  // 输出: Hello, TypeScript!
console.log(message);  // 输出: Welcome to Hello, TypeScript!

解读:

  • greeting 是一个简单的字符串。
  • message 使用了模板字符串,可以在字符串中嵌入表达式。
boolean

介绍:
boolean 类型表示逻辑值,只有两个可能的值:truefalse

应用场景:

  • 条件判断、开关状态、逻辑运算等。

代码示例:

let isStudent: boolean = true;
let isLoggedIn: boolean = false;

console.log(isStudent);  // 输出: true
console.log(isLoggedIn);  // 输出: false

解读:

  • isStudentisLoggedIn 分别表示两个布尔值。
  • 布尔值常用于条件语句中,如 if 语句。
enum

介绍:
enum 类型用于定义一组命名的常量。它可以帮助你更好地组织代码,并提高代码的可读性。

应用场景:

  • 状态码、选项列表、配置项等。

代码示例:

enum Color {
    Red,
    Green,
    Blue
}

let selectedColor: Color = Color.Blue;

console.log(selectedColor);  // 输出: 2

解读:

  • Color 枚举定义了三个颜色选项。
  • selectedColor 被赋值为 Color.Blue,其值为 2
void

介绍:
void 类型用于表示没有返回值的函数。它通常用于函数的返回类型声明。

应用场景:

  • 不返回任何值的函数。

代码示例:

function logMessage(): void {
    console.log("This is a log message.");
}

logMessage();  // 输出: This is a log message.

logMessage 函数没有返回值,因此其返回类型为 void

nullundefined

概念:
nullundefined 是两种特殊的数据类型,分别表示空值和未定义的值。

应用场景:

  • 初始化变量、处理未定义的值、空值检查等。

代码示例:

let emptyValue: null = null;
let undefinedValue: undefined = undefined;

console.log(emptyValue);  // 输出: null
console.log(undefinedValue);  // 输出: undefined

emptyValue 被显式赋值为 null

undefinedValue 被显式赋值为 undefined

anynever

概念:

  • any 类型允许变量存储任何类型的值,通常用于与动态内容交互或绕过类型检查。
  • never 类型表示永远不会发生的值,通常用于函数的返回类型,表示函数永远不会返回。

应用场景:

  • any:处理动态内容、与第三方库交互等。
  • never:处理异常、无限循环等。

代码示例:

let dynamicValue: any = "This can be anything";
dynamicValue = 42;

function throwError(message: string): never {
    throw new Error(message);
}

console.log(dynamicValue);  // 输出: 42
throwError("An error occurred");  // 抛出错误

dynamicValue 可以存储任何类型的值。

throwError 函数永远不会返回,因此其返回类型为 never

②变量声明方式

在 TypeScript 中,变量声明有多种方式,每种方式都有其特定的应用场景和优缺点。

■ 显式类型声明

显式类型声明是指在声明变量时明确指定其类型。这种方式可以提高代码的可读性和可维护性。

应用场景:

  • 需要明确指定变量类型的场景。

代码示例:

let name: string = "Alice";
let age: number = 30;

console.log(name);  // 输出: Alice
console.log(age);  // 输出: 30

name 被显式声明为 string 类型。

age 被显式声明为 number 类型。

■ 隐式类型推断

介绍:
隐式类型推断是指 TypeScript 根据变量的初始值自动推断其类型。这种方式可以减少代码量,但可能会降低代码的可读性。

应用场景:

  • 变量初始值明确且类型简单的场景。

代码示例:

let name = "Alice";  // TypeScript 推断 name 为 string 类型
let age = 30;  // TypeScript 推断 age 为 number 类型

console.log(name);  // 输出: Alice
console.log(age);  // 输出: 30

解读:

  • nameage 的类型由 TypeScript 自动推断。
■ 未初始化的变量

介绍:
未初始化的变量是指在声明变量时未指定初始值。这种情况下,变量的类型默认为 any,除非显式指定类型。

应用场景:

  • 变量初始值不确定或需要在后续代码中赋值的场景。

代码示例:

let name: string;  // 显式声明类型
let age;  // 未初始化,类型默认为 any

name = "Alice";
age = 30;

console.log(name);  // 输出: Alice
console.log(age);  // 输出: 30

解读:

  • name 被显式声明为 string 类型。
  • age 未初始化,类型默认为 any
③变量作用域

变量作用域决定了变量在代码中的可见性和生命周期。了解变量作用域可以帮助你更好地组织代码,避免变量冲突和意外行为。

■ 全局作用域

全局作用域是指变量在程序的任何地方都可以访问。全局变量通常定义在程序的最外层。

应用场景:

  • 需要在多个模块或函数中共享的变量。

代码示例:

let globalVar = "I am global";

function printGlobal() {
    console.log(globalVar);  // 输出: I am global
}

printGlobal();

globalVar 是一个全局变量,可以在任何地方访问。

■ 类作用域(实例变量与静态变量)

类作用域是指变量在类内部定义,可以通过类的实例或类名访问。实例变量属于类的实例,静态变量属于类本身。

应用场景:

  • 需要在类内部共享的变量。

代码示例:

class MyClass {
    instanceVar = "I am an instance variable";
    static staticVar = "I am a static variable";

    printInstanceVar() {
        console.log(this.instanceVar);
    }

    static printStaticVar() {
        console.log(MyClass.staticVar);
    }
}

let obj = new MyClass();
obj.printInstanceVar();  // 输出: I am an instance variable
MyClass.printStaticVar();  // 输出: I am a static variable

instanceVar 是一个实例变量,通过类的实例访问。

staticVar 是一个静态变量,通过类名访问。

■ 局部作用域

局部作用域是指变量在函数或代码块内部定义,只能在定义它的函数或代码块内部访问。

应用场景:

  • 需要限制变量可见性的场景。

代码示例:

function printLocalVar() {
    let localVar = "I am a local variable";
    console.log(localVar);  // 输出: I am a local variable
}

printLocalVar();
// console.log(localVar);  // 错误: localVar 在此处不可访问

localVar 是一个局部变量,只能在 printLocalVar 函数内部访问。


2.TypeScript中的运算符

运算符是用于执行特定操作的符号或关键字。TypeScript 支持多种运算符,包括算术运算符、关系运算符、逻辑运算符、赋值运算符、三元运算符、字符串运算符和类型运算符

① 算术运算符

算术运算符用于执行基本的数学运算。

示例:

var num1: number = 10;
var num2: number = 2;
var res: number = 0;

res = num1 + num2;
console.log("加: " + res);  // 输出: 12

res = num1 - num2;
console.log("减: " + res);  // 输出: 8

res = num1 * num2;
console.log("乘: " + res);  // 输出: 20

res = num1 / num2;
console.log("除: " + res);  // 输出: 5

res = num1 % num2;
console.log("余数: " + res);  // 输出: 0

num1++;
console.log("num1 自增运算: " + num1);  // 输出: 11

num2--;
console.log("num2 自减运算: " + num2);  // 输出: 1

其中:

  • + 用于加法运算。
  • - 用于减法运算。
  • * 用于乘法运算。
  • / 用于除法运算。
  • % 用于取模运算,返回除法的余数。
  • ++ 用于自增运算,将变量的值加 1。
  • -- 用于自减运算,将变量的值减 1。
② 关系运算符

关系运算符用于比较两个值,并返回一个布尔值(truefalse)。

示例:

var num1: number = 5;
var num2: number = 9;

console.log("num1 的值为: " + num1);  // 输出: 5
console.log("num2 的值为: " + num2);  // 输出: 9

var res: boolean = num1 > num2;
console.log("num1 大于 num2: " + res);  // 输出: false

res = num1 < num2;
console.log("num1 小于 num2: " + res);  // 输出: true

res = num1 >= num2;
console.log("num1 大于或等于 num2: " + res);  // 输出: false

res = num1 <= num2;
console.log("num1 小于或等于 num2: " + res);  // 输出: true

res = num1 == num2;
console.log("num1 等于 num2: " + res);  // 输出: false

res = num1 != num2;
console.log("num1 不等于 num2: " + res);  // 输出: true

  • > 用于判断左边的值是否大于右边的值。
  • < 用于判断左边的值是否小于右边的值。
  • >= 用于判断左边的值是否大于或等于右边的值。
  • <= 用于判断左边的值是否小于或等于右边的值。
  • == 用于判断两个值是否相等。
  • != 用于判断两个值是否不相等。
③ 逻辑运算符

逻辑运算符用于组合或反转布尔值,无非也就是与或非那一套;

示例:

var avg: number = 20;
var percentage: number = 90;

console.log("avg 值为: " + avg + ", percentage 值为: " + percentage);  // 输出: 20, 90

var res: boolean = ((avg > 50) && (percentage > 80));
console.log("(avg > 50) && (percentage > 80): " + res);  // 输出: false

var res: boolean = ((avg > 50) || (percentage > 80));
console.log("(avg > 50) || (percentage > 80): " + res);  // 输出: true

var res: boolean = !((avg > 50) && (percentage > 80));
console.log("!((avg > 50) && (percentage > 80)): " + res);  // 输出: true

解读:

  • && 是逻辑与运算符,只有当两个表达式都为 true 时,结果才为 true
  • || 是逻辑或运算符,只要有一个表达式为 true,结果就为 true
  • ! 是逻辑非运算符,用于反转布尔值,如果表达式为 true,则结果为 false,反之亦然。
④ 赋值运算符

赋值运算符用于将值赋给变量。

示例:

var a: number = 12;
var b: number = 10;

a = b;
console.log("a = b: " + a);  // 输出: 10

a += b;
console.log("a += b: " + a);  // 输出: 20

a -= b;
console.log("a -= b: " + a);  // 输出: 10

a *= b;
console.log("a *= b: " + a);  // 输出: 100

a /= b;
console.log("a /= b: " + a);  // 输出: 10

a %= b;
console.log("a %= b: " + a);  // 输出: 0

解读:

  • = 用于将右边的值赋给左边的变量。
  • += 先进行加法运算,然后将结果赋给左边的变量。
  • -= 先进行减法运算,然后将结果赋给左边的变量。
  • *= 先进行乘法运算,然后将结果赋给左边的变量。
  • /= 先进行除法运算,然后将结果赋给左边的变量。
  • %= 先进行取模运算,然后将结果赋给左边的变量。
⑤ 三元运算符

三元运算符是一种简洁的条件表达式,用于根据条件选择不同的值。可以将其看作是一种条件语句,在小范围赋值的情况下很好用,;例如设置默认值;

示例:

var num: number = -2;
var result = num > 0 ? "大于 0" : "小于 0,或等于 0";
console.log(result);  // 输出: 小于 0,或等于 0

解读:

  • 三元运算符的语法是 condition ? expr1 : expr2
  • 如果 conditiontrue,则返回 expr1,否则返回 expr2
⑥ 字符串运算符

字符串运算符用于连接字符串。

示例:

var msg: string = "hello " + "world";
console.log(msg);  // 输出: hello world

解读:

  • + 运算符用于连接两个字符串。
⑦ 类型运算符

类型运算符用于获取变量的类型。

示例:

var num = 12;
console.log(typeof num);  // 输出: number

typeof 运算符返回操作数的数据类型。


三、总结

在本文中,我们深入探讨了 TypeScript 的基础知识,包括其定义、与 JavaScript 的区别等信息;详细说明了TypeScript如何声明变量和使用各种数据类型,如 numberstringboolean等。此外,我们还了解了 TypeScript 中的运算符,包括算术运算符、关系运算符、逻辑运算符、三元运算符等使用案例;

通过这些内容,我们初步掌握了 TypeScript 的核心概念和基本语法,为后续的学习打下了坚实的基础。

在下一篇文章中,作者将深入探讨 TypeScript 的控制语句,包括条件语句(如 ifelseswitch)和循环语句(如 forwhiledo...while)。这些控制语句是编程中的基础,掌握它们将帮助我们编写更加复杂和功能强大的程序。

敬请期待!🚀


相关链接

  • 项目地址:TypeScript-CookBook
  • 相关文档:专栏地址
  • 作者主页:GISer Liu-CSDN博客

thank_watch

如果觉得我的文章对您有帮助,三连+关注便是对我创作的最大鼓励!或者一个star🌟也可以😂.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2144001.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【漏洞复现】科荣AIO UtilServlet 代码执行漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

学习实践: Procdump获取本地远控信息

看到一篇文章是通过Procdump获取ToDesk远控信息的&#xff0c;于是实操了一下&#xff1b;顺便也测试了一下向日葵远控&#xff0c;发现都是适用的。该方法对于肉鸡提权有一定价值。 1、获取ToDesk远控信息 测试版本&#xff1a;ToDesk v4.7.4.3 测试工具&#xff1a;procdump、…

【Java EE】文件IO

Author&#xff1a;MTingle major:人工智能 --------------------------------------- Build your hopes like a tower! 目录 一、文件是什么&#xff1f; 二、针对文件系统操作的API 1.文件路径&#xff0c;文件名&#xff0c;文件是否存在 2. 创建文件 3.删除文件&#…

推动公平学习与身份归一化的视网膜神经疾病数据集

人工智能咨询培训老师叶梓 转载标明出处 在机器学习领域&#xff0c;公平性&#xff08;也称为公正性或平等性&#xff09;是一个日益受到关注的话题&#xff0c;它对于社会的福祉至关重要。然而&#xff0c;目前缺乏专门用于公平学习且包含成像数据的公共医学数据集&#xff…

vs2022配置opencv==4.9.0(C++)

1、下载opencv-windows [opencv4.9.0下载地址](Releases - OpenCV) 下载4.9.0版本&#xff1a; 双击下载好的opencv-4.9.0-windows.exe&#xff0c;选择安装路径&#xff1a; 2、配置opencv环境 &#xff08;1&#xff09;添加系统环境变量 此电脑–>右键“属性”–…

小红书治愈插画副业,猛猛涨粉上万+,每天只用5分钟

在这个数字化时代&#xff0c;AI技术正以前所未有的速度改变着我们的生活和工作。特别是在内容创作领域&#xff0c;AI的运用已经催生了一种全新的创作模式。一幅幅温馨可爱的治愈插画如同清流&#xff0c;不仅契合当下年轻人生活的状态&#xff0c;更成为许多人表达生活态度、…

「iOS」push与present

iOS学习 前言push与poppresent与dismiss使用dismiss弹出多级PresentedViewController 与 PresentingViewController区别 总结 前言 在此前就学习过视图的push与present。与之对应的退出方法为pop与dismiss。这里进行一次总结。 push与pop pushViewController 是通过导航控制器…

黑神话:悟空 后话

《黑神话&#xff1a;悟空》在游戏界掀起了波澜。对许多人来说&#xff0c;包括我自己&#xff0c;这款游戏是我们一直期待的——一款纯粹、沉浸且专注于高质量游戏体验的作品。它不追求现代趋势&#xff0c;没有微交易或在线服务模式&#xff0c;也没有为了未来扩展包而设计的…

PumpkinFestival靶机详解

靶机下载地址 https://www.vulnhub.com/entry/mission-pumpkin-v10-pumpkinfestival,329/ 靶机配置 主机发现 arp-scan -l 端口扫描 nmap -sS -Pn -A -p- -n 192.168.229.163 访问网页 http://192.168.229.163/ 这些可能是用户名和账号留存 F12查看页面源码&#xff0c;发…

瑞芯微RK3588开发板Linux系统添加自启动命令的方法,深圳触觉智能Arm嵌入式鸿蒙硬件方案商

本文适用于触觉智能所有Linux系统的开发板、主板添加自启动命令的方法&#xff0c;本次使用了触觉智能的EVB3588开发板演示&#xff0c;搭载了瑞芯微RK3588旗舰芯片。 该开发板为核心板加底板设计&#xff0c;为工业场景设计研发的模块化产品&#xff0c;10年以上稳定供货,帮助…

2024年9月18日历史上的今天大事件早读

1043年9月18日 范仲淹实行改革 1393年9月18日 “活财神”沈万三逝世 1783年9月18日 瑞士著名数学家欧拉逝世 1851年9月18日 《纽约时报》创刊 1903年9月18日 清末爱国将领冯子材逝世 1917年9月18日 护法战争爆发 1931年9月18日 “九一八”事变爆发 1936年9月18日 阎锡山…

SOMEIP_ETS_115: SD_Entry_references_more_options_than_exist

测试目的&#xff1a; 验证DUT能够拒绝一个订阅请求&#xff0c;该请求中的选项引用超出了实际存在的选项数量&#xff0c;并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议&#xff0c;当接收到一个引用了比实际存在的更多选项的Subscrib…

SPI中的CPOL和CPHA

SPI中的CPOL和CPHA学习SPI必须掌握的知识&#xff0c;因为它涉及到“数据位采集”。重点掌握空闲时SCK的电平是怎么定义的。采集时&#xff0c;是怎么规定发生在哪个时钟边沿。CPOL用来决定SPI总线在空闲时,SPI_SCK引脚输出的电平;CPHA用来决定“数据位采集点”发生在第几边沿。…

【Python】从基础到进阶(八):文件操作与上下文管理

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、Python文件操作基础1. 打开文件2. 读取文件3. 写入文件4. 文件指针定位 三、上下文管理1. 使用with管理文件2. 自定义上下文管理器 四、文件操作的最佳实践五、案例&#xff1a;日志文件管理1. 需求分析2. 实现…

低代码技术:简化应用开发的未来

近年来&#xff0c;低代码技术作为一种新兴的应用开发方法&#xff0c;受到了广泛关注。低代码平台通过图形化的界面和预设的模块&#xff0c;使得用户能够以较少的代码编写工作创建应用程序。这一技术的发展&#xff0c;标志着软件开发过程中的一个重要变革。 低代码技术的基…

【Linux系统编程】第二十弹---进程优先级 命令行参数 环境变量

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、进程优先级 2.1、什么是优先级 2.2、优先级的描述 2.3、优先级与权限的关系 2.4、为什么要有优先级 2.5、Linux优先级的…

【产品更新】中汇保函及汇匠源保证金保函平台

中汇保函 新增 1.新增小程序查询验证功能&#xff0c;手机输入即可查验。 2.新增小程序客户案例案例&#xff0c;合作单位及案例展示页面。 3.履约保函、预付款保函、质量保函、工程款支付保函订单提交及订单状态查验。 4.PC产品官网已经上线&#xff0c;可随时访问了解产品介…

【Java】synchronized 基础线程安全

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持&#xff01; 在多线程编程中&#xff0c;线程安全是一个至关重要的概念。Java 提供了多种机制来处理线程安全问题&#xff0c;其中 synchronized 关键字是最常用和最基础的一种。本文将介绍线程安全问题的原因&a…

智创未来,景联文科技提供全方位数据采集服务

随着科技的日新月异&#xff0c;人工智能技术正在改变我们的生活与工作方式&#xff0c;数据成为推动人工智能&#xff08;AI&#xff09;技术发展的基石。 高质量的数据对于训练机器学习模型、提升算法性能以及实现智能应用的广泛部署至关重要。 景联文科技凭借卓越的技术实力…

Android14请求动态申请存储权限

Android14请求动态申请存储权限 Android14和Android15存储权限有增加多了选择部分&#xff0c;还是全部。一个小小的存储权限真的被它玩出了花来。本来Android13就将存储权限进行了3个细分&#xff0c;是图片&#xff0c;音频还是视频文件。 步骤一&#xff1a;AndroidManife…