react - TS

news2025/1/22 12:43:29

TypeScript

TypeScript 简称『TS』,是微软开发的一个开源的编程语言。

在这里插入图片描述

一、TS 特点

TS 主要有如下几个特点:

  • 完全兼容 JavaScript,是 JavaScript 的超集

  • 引入类型系统,可以尽早的定位错误位置, 帮助提升开发效率

  let obj = {a:1,b:2....}
  obj = ()=>{}
  console.log(obj.a);
  • 先进的 JavaScript,支持 JavaScript 的最新特性

TypeScript 在社区的流行度越来越高,它非常适用于一些大型项目,

也非常适用于一些基础库,极大地帮助我们提升了开发效率和体验。

二、TS 环境搭建

  • 全局安装:npm i typescript -g或者yarn add global typescript

    • npm root -g : 查看全局包安装的路径
  • 使用命令检查是否安装成功以及查看包的版本:tsc -v

三、TS 初体验

  • typescript 初始化. 创建 ts 的配置文件tsconfig.json 【只要在脚手架里面就需要进行配置文件初始化】
tsc --init 
  1. 创建一个 JS 文件 『hello.ts』

    let str: string = 'hello world';
    console.log(str);
                    //参数类型         //返回值类型
    function add(a: number, b:number):number{
      return a + b;
    }
    console.log(add(1, 100));
    

    注意:ts 本身不能直接运行, 必须要转为 js才可以运行

  2. 命令行运行,这里的后缀是 ts

    tsc hello.ts
    
  3. 命令行运行,这里的后缀是 js

    node hello.js
    

四、Webpack 打包 TS 文件

项目中可以借助 webpack 打包工具来直接处理 ts 文件。操作步骤如下:

  1. 创建目录结构

    - src
        - index.ts
    - public
    	- index.html
    
  2. 安装 webpack 以及相关的工具包

    npm init (-y)
    npm i webpack webpack-cli webpack-dev-server ts-loader html-webpack-plugin typescript  -D
    
  3. 根目录下添加配置文件

    webpack.prod.js

    const HtmlWebpackPlugin = require('html-webpack-plugin')
    
    module.exports = {
        entry: './src/index.ts',
        output: {
            path: resolve(__dirname, '../dist'),
            filename: 'js/bundle.js'
        },
        mode: 'production',
        module: {
            rules: [
                {
                    test: /\.tsx?$/,
                    use: 'ts-loader'
                }
            ]
        },
        plugins: [
            new HtmlWebpackPlugin({
                template: './public/index.html',
                // inject: 'body'
            })
        ],
    
    }
    

    webpack.dev.js

   const configProd = require('./webpack.prod');
   module.exports = {
       ...configProd,
       devServer: {
           host: '127.0.0.1',
           port: 3000,
           open: true
       },
       mode: 'development',
   }
  1. config目录下创建 『tsconfig.json』

    tsc --init
    
  2. 如果想要沿用之前的npm start,需要在package.json配置文件中添加一条配置

   "build": "npx webpack --config ./config/webpack.prod.js",
   "start": "npx webpack serve --config ./config/webpack.dev.js"

五、TS 语法

友情提示:当如果有多个ts文件需要进行导入的话,最终都会变成全局变量来解析,容易发生重名,可以导出{}

5.1 TS 基础类型

TypeScript 支持与 JavaScript 几乎相同的数据类型,此外还提供了实用的枚举类型方便我们使用

TS 支持的变量类型如下:

类型描述
boolean限制为布尔类型, true 或者 false
number限制为任意的数字。 二进制,八进制,十进制,十六进制均可
string限制为任意的字符串。单引号,双引号,反引号均可
字面量限制为某个字面量的值
any限制为任意类型
void限制为 undefined, 一般用来限制函数的返回值
never限制函数没有返回值
object限制为对象类型
array限制为数组类型
tuple 元组限制为固定长度与类型的数组
enum 枚举限制为枚举的数据

5.1.1 布尔类型

最基本的数据类型就是简单的 true/false 值,在JavaScript 和 TypeScript 里叫做 boolean(其它语言中也一样)。

let bool: boolean = true;
console.log(bool); 

let bool1: boolean;
console.log(bool1); //这种写法变量没有赋值,则值就是undefined,但是b变量的数据类型要求是boolean所以报错

let bool2: boolean = true;
bool2 = false;
console.log(bool2)

let bool3: boolean = true;
bool3 = 100; //不能将类型“number”分配给类型“boolean”
console.log(bool3)

const a: boolean = true;
a = false; //无法分配到 "a" ,因为它是常数。
console.log(a)

5.1.2 数字类型

除了支持十进制和十六进制字面量,也支持二进制和八进制字面量。

let num0: number = 0b0110101;//二进制数值
console.log(num0); //53
let num: number = 100; //十进制数值
console.log(num); //100
let num1: number = 0o56; //八进制数值
console.log(num1); //46
let num2: number = 0x5F; //十六进制数值
console.log(num2);//95
let num3: number = Infinity;//无穷大
console.log(num3)//Infinity
let num4: number = 34.56 //浮点数
console.log(num4);//34.56
let num5: number = -56; //负数
console.log(num5); //-56

5.1.3 字符串类型

JavaScript 程序的另一项基本操作是处理网页或服务器端的文本数据。 像其它语言里一样,我们使用 string 表示文本数据类型。 和 JavaScript 一样,可以使用双引号(")或单引号(')表示字符串。

let name:string = 'tom'
name = 'jack'
// name = 12 // error
let age:number = 12
const info = `My name is ${name}, I am ${age} years old!`

5.1.4 字面量类型

TS 允许限制某个变量为固定的某个值,用的很少

let x: 123 = 123;  //变量的值只能是123
// x = 456; //不能修改成其他值,有点类似于const常量
console.log(x)

let y: 'hello';
y = 'hello';
console.log(y)

5.1.5 any

any 类型允许变量的值为任意类型, 并且可以进行任意类型的赋值

let a: any;
a = 100;
a = 'hello';
a = {};
a = [];
console.log(a)

5.1.6 void

void 限制值为 undefined,可以限制变量的值或者是函数的返回值,更多的时候是限制函数的返回值

let v: void;
console.log(v); //undefined


function fn1(): void {
    return;
}
console.log(fn1()); //undefined

let fn = (): void => {
    return;
}
console.log(fn());  //undefined

5.1.7 never

永远不会有值的一种类型(必须存在无法达到的终点),基本不用

function fn(): never {
    throw new Error('出错啦');
}
fn();

5.1.8 对象

object 限制类型为对象,

let obj: object = {name:'张三',age:23};
console.log(obj)

5.1.9 数组

用的比较多

TypeScript 像 JavaScript 一样可以操作数组元素。 不过数组中元素值的类型都是一样的.

有两种方式可以定义数组。

​ 第一种,可以在元素类型后面接上[],表示由此类型元素组成的一个数组:

​ 第二种, 方式是使用数组泛型,Array<元素类型>

//1) 直接咋变量后面添加:类型[] 要求元素中每一个都是限制的这个类型
let arr: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(arr)

let arr1: string[] = ['张三', '李四', '王五'];
//操作数组
arr1.push('赵六');

console.log(arr1)

//2) 泛型  Array<约束类型>
let arr2: Array<Boolean> = [true, false, true];
console.log(arr2)

console.log(arr2.join('/'))

5.1.10 元组

元组(Tuple)类型允许表示一个已知元素数量和类型的数组各元素的类型不必相同用的较少

let persons: [string, number] = ['王二麻子', 18];
console.log(persons)


let arr: [object, Array<number>] = [{ a: 100 }, [10, 20, 30]];
console.log(arr)
console.log(arr[0]);
console.log(arr[1]);

let arr1: [string, number][] = [
    ['张三', 18],
    ['李四', 19],
    ['王五', 20]
]
console.log(arr1)

5.1.11 枚举

枚举(enum)类型是对 JavaScript 标准数据类型的一个补充。

使用枚举类型可以为一组数值赋予友好的名字

一般用于组织一些有相似之处的常量,让这些常量更规范、更统一。

enum gender {
    nan = '男',
    nv = '女',
    screct = '保密'
}

//11.创建一个枚举类型的变量
let sex: object = {
    sex: gender.nv
}
console.log(sex)

5.2 联合类型

联合类型(Union Types)表示取值可以为多种类型中的一种。

let x: string | number;
x = 'hello world'
x = 100;
// x = true; //其他类型不允许
console.log(x);

5.3 类型断言

类型断言(Type Assertion)可以告诉编译器,“相信我,我知道自己在干什么,别报错,出了事我负责”。

let x: string | number;
x = 34.55666;
// console.log(x.toFixed(2));
//方法一:as
// console.log((x as number).toFixed(2))
//方法二:类型
console.log((<number>x).toFixed(2))

5.4 类型推断

TS 会在没有明确的指定类型的时候推测出一个类型。主要有下面两种情况

  1. 变量声明时赋值了,推断为值对应的类型
  2. 变量声明时没有赋值, 推断为 any 类型
let t = 123;
// t = true; //已经赋值了的变量规定为number,再次修改也必须为number
t = 23;
console.log(t)

let y;
y = 100;
y = 'hello';
y = true;
console.log(y)

5.2 函数

TypeScript 为 JavaScript 函数添加了额外的功能

5.2.1 参数与返回值类型

TypeScript 可以为参数与返回值设置类型,代码示例如下:

//1、普通函数
//参数添加类型
function fun(a: number, b: number) {
    console.log(a + b)
}
fun(1, 2);
//添加函数返回值类型
function fun1(x: string, y: number): string {
    return x + y;
}
console.log(fun1('11', 20));

//2、箭头函数
let fun2 = (a: number, b: number): number => {
    return a + b;
}
console.log(fun2(12, 34));

TypeScript 能够根据返回语句自动推断出返回值类型,因此我们通常省略返回值的类型。

5.2.2 函数声明的完整形式

现在我们已经为函数指定了类型,下面让我们写出函数的完整类型。

//4、声明函数
let fun5: (a: number, b: number) => number = (x: number, y: number): number => {
    return x + y;
}
console.log(fun5(10, 20));

5.2.3 可选参数

TypeScript 默认要求函数实参数量要与形参的数量保持一致,不过可以使用『 ?: 』设置参数为可选参数

let fn = (a: number, b: number, c?: number) => {
    console.log(a);
    console.log(b);
    console.log(c);
}

fn(1, 2)

5.2.4 参数默认值

TypeScript 与 JavaScript 一样,允许为参数设置默认值

let fun6: (a: number, b: number, c?: number) => number = (x: number, y: number, z: number = 40): number => {
    return x + y + z;
}
console.log(fun6(10, 20, 100));

5.2.5 剩余参数

针对不定个数参数的函数时,我们可以使用 ES6 提供的 rest 参数来处理。不过在 TypeScript 中需要设置类型。

//剩余参数
function add(a: number, b: number, ...args: number[]){
  //求和
  args = [a, b, ...args];
  return args.reduce((prev: number, current: number) => {
    return prev + current;
  })
}

5.3 类

TS 中的类与 JS 的类使用方式类似, 不过增加了对属性与方法的类型限制

5.3.1 成员类型限制

这里的类型限制跟变量和函数的类型限制是非常相似的

class Student {
    //属性
    name: string = '张三'
    age: number;
    height: number;

    constructor(age: number, height: number) {
        this.age = age;
        this.height = height;
    }

    //方法
    play(): void {
        console.log('玩')
    }

    study(): string {
        return '学习'
    }
}
let s1 = new Student(10, 180);
console.log(s1)

//调用方法
s1.play();
console.log(s1.study())

5.3.2 继承

TypeScript 继承语法与 JavaScript 完全相同

class Person {
    address: string = '北京市'
    name: string;
    age: number;
    height: number;
    constructor(name: string, age: number, height: number) {
        this.name = name;
        this.age = age;
        this.height = height;
    }

    eat(address: string, who: string): string {
        return '吃'
    }
}



class Student extends Person {
    weight: number;
    constructor(name: string, age: number, height: number, weight: number) {
        super(name, age, height);
        this.weight = weight;
    }
    //对父类的方法进行重写
    eat(address: string, who: string): string {
        return this.name + '在' + address + '和' + who + '吃饭';
    }
}

let s1 = new Student('张三', 23, 180, 120);
console.log(s1)

//调用方法
console.log(s1.eat('街边', '女朋友'))

5.3.3 成员修饰符

一些面向对象编程语言(Java, C++)中都有成员修饰符特性,TypeScript 也引入成员修饰符。

成员修饰符有三个:

  • public (默认) 公开的
  • protected 受保护的
  • private 私有的

这些修饰符实现了对象成员的访问控制

自身类子类类外部
public
protectedX
privateXX
//继承
class Father {
  public name: string;
  protected age: number;
  private salary: number;

  constructor(name: string, age: number, salary: number){
    this.name = name;
    this.age = age;
    this.salary = salary;
  }

  info(){
    console.log(this.name);
    console.log(this.age);
    console.log(this.salary);
  }
}

class Son extends Father{
  constructor(name: string, age: number, salary: number){
    super(name, age, salary);
  }

  checkSalary(){
    console.log(this.name);
    console.log(this.age);
  }
}

let xue = new Son('xue', 26, 16000);

console.log(xue.name);

5.4 接口

5.4.1 基本使用

TypeScript 中引入了接口,用来限制对象的结构与类型。代码示例:

//声明接口
interface BoyFriend{
    name: string;
    age: number;
}
//声明对象 满足接口结构与类型要求
let zhangsan: BoyFriend = {
    name: '张三',
    age: 18,
}

console.log(zhangsan);

上述代码中,对象的属性不能多, 也不能少,属性值的类型也必须满足接口的要求

5.4.2 可选属性

如果某些属性不是固定的,只是某些条件下存在,可以使用可选属性配置

interface BoyFriend{
    name: string,
    age: number,
    car ?: string
}

这样设置之后,对象中的 car 属性就不是必须的属性

5.4.3 只读属性

如果一些属性的值不允许修改,则可以使用『readonly』标志,这样一旦发现被修改,立即报错

interface BoyFriend{
    readonly id: number,
    name: string,
    age: number,
    car ?: string
}

这样设置后, 如果修改 id 属性, 编译器就会报错

readonly 与 const 的功能很像,不过 readonly 是限制对象的属性, const 是限制变量的值

5.4.4 限制方法

接口除了可以限制属性类型之外,也可以对对象的方法进行限制

interface BoyFriend{
    readonly id: number,
    name: string,
    age: number,
    car ?: string,
    //必选
    cook: () => void,
    //可选
 	skeep?: () => void  
}
 //当如果接口中的定义的方法为可选的方法的时候,在对象实现的时候并且调用那么程序将认为这个可选的方法属性有可能存在,也有可能不存在
//如果存在则是接口中的定义的方法值,如果不存在则为undefiend
//解决办法有两个
//1、修改tsconfig.json文件中的strict严格模式为false,如果修改了配置文件需要[重启脚手架],那么将不在进行严格的检查  但是这种形式会忽略到一些其他的语法检查 [不太推荐]
//2、只要调用可选方法,在调用的()的前面添加一个!,程序就会认为该方法skeep一定是存在 [推荐]
console.log(obj.speek!()) */
    
    obj.skeep!()

该接口要求对象必须要有 cook 方法且返回结果必须为 undefined

5.4.5 类与接口

之前接口只能限制单个对象的结构与类型,接口与类结合之后,可以约束一类对象的结构与类型

interface BoyFriend {
    name: string;
    age: number;
    car ?: string;
    cook: () => void
}

class Person implements BoyFriend{
    name: string;
    age: number;
    car: string;

    constructor(name: string, age: number, car: string){
        this.name = name;
        this.age = age;
        this.car = car;
    }

    cook(){
        console.log('我可以做蛋炒饭~~');
    }
}

5.4.6 类的多实现

一个类可以同时实现多个接口,类必须要包含对应的属性和方法才能通过编译

语法:class 类名 implements 接口名称1,接口名称2…{}

interface BoyFriend{
    readonly id: number,
    name: string,
    age: number,
    car ?: string,
    cook: () => void  
}

interface Staff{
    name: string
    age: number
    programTS: () => void;
}

class Person implements BoyFriend, Staff{
    //对象属性
    id:number
    name: string
    age: number

    //构造方法
    constructor(id: number, name: string, age: number){
        this.id = id;
        this.name = name;
        this.age = age;
    }

    //对象的方法
    cook(): void{
        console.log('做方便面。。。');
    }

    //对象方法
    programTS(){
        console.log('我可以编写 TypeScript');
    }
}

5.4.7 接口的继承

当接口中出现重复结构时,可以对公共部分进行抽离,然后通过继承来简化代码

interface BasicInfo{
    name: string,
    age: number,
}

interface BoyFriend extends BasicInfo{
    readonly id: number,
    car ?: string,
    cook: () => void  
}

interface Staff extends BasicInfo{
    programTS: () => void;
}

5.5 泛型

泛型(generic)指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定具体类型的一种特性。

5.5.1 引入

下面创建一个函数, 实现功能: 根据指定的数量 count 和数据 value , 创建一个包含 countvalue 的数组 不用泛型的话,这个函数可能是下面这样:

function createArray (count:number,value:any):any[]{
  const arr:any[] = []
  for (let index = 0; index < count; index++) {
    arr.push(value)
  }
  return arr
}

const arr01 = createArray(3,'hello')
const arr02 = createArray(3,100)

console.log(arr01[0].split('')) //运行不报错,但编码时没有提示
console.log(arr02[0].toFixed(3)) //运行不报错,但编码时没有提示
console.log(arr02[0].split('')) //运行报错,但编码时没有提示错误 

5.5.2 泛型函数

function createArray <P>(count:number,value:P):P[]{
  const arr:P[]= []
  for (let index = 0; index < count; index++) {
    arr.push(value)
  }
  return arr
}

const arr03 = createArray<string>(3,'hello')
const arr04 = createArray<number>(3,100)
console.log(arr03[0].split(''))
console.log(arr04[0].toFixed(1))
console.log(arr04[0].split('')) //error 类型“number”上不存在属性“split”

5.5.3 多个泛型参数的函数

一个函数可以定义多个泛型参数

function createArray <T,P> (a: T, b: P): [T, P] {
  return [a, b]
}

const result = createArray<string, number>('abc', 123)
console.log(result[0].length)
console.log(result[1].toFixed())

5.5.4 泛型接口

在定义接口时, 为接口中的属性或方法定义泛型类型
在使用接口时, 再指定具体的泛型类型

// 声明一个接口
interface Response<T>{
  status: number,
  headers: object,
  data: T,
}

interface Stu{
  id: number,
  name: string,
  age: number,
}

interface Book{
  id: number,
  title: string,
  price: number
}

//一个对象
let response: Response<Book> = {
  status: 200,
  headers: {},
  data: {
    id: 1,
    title: '西游记',
    price: 28
  }
}

let response2: Response<Stu> = {
  status: 200,
  headers: {},
  data: {
    id: 1,
    name: 'xx',
    age: 19
  }
}

5.5.5 泛型类

在定义类时, 为类中的属性或方法定义泛型类型 在创建类的实例时, 再指定特定的泛型类型

//泛型类
class Container<T>{
  //用于储存数据
  store: T[];
  constructor(store: T[]){
    this.store = store;
  }
}

let books = new Container<Book>([{id: 1, title: '西游记', price: 10}, {id: 2, title: '三国演义', price: 25}])

5.5.6 泛型约束

如果我们直接对一个泛型参数取 length 属性, 会报错, 因为这个泛型根本就不知道它有这个属性

// 没有泛型约束
function fn <T>(x: T): void {
  // console.log(x.length)  // error
}

我们可以使用泛型约束来实现

interface Lengthwise {
  length: number;
}

// 指定泛型约束
function fn2 <T extends Lengthwise>(x: T): void {
  console.log(x.length)
}

fn2('abc')
// fn2(123) // error  number没有length属性

5.6 其他

5.6.1 类型声明

可以使用 type 关键字声明类型

//1. 类型声明
type Computer = {
  brand: string,
  price: number
}

interface Person{
  name: string,
  age: number
}

type Persons = Person[];

//2. 获取某个变量的类型
let me: string = '尚硅谷';
type SchoolType = typeof me;

//3. 获取接口键名的联合类型
function getInfo(obj: Person, key: keyof Person): void{
  obj[key]
}

//4. 获取函数的返回值类型
type retType = ReturnType<typeof getInfo>;
                          
//5. 获取函数参数类型. 返回类型为『元组』类型
type paramsType = Parameters<typeof getInfo>

5.6.2 内置类型

JavaScript 中有很多内置对象,它们可以直接在 TypeScript 中当做定义好了的类型。

内置对象是指根据标准在全局作用域(Global)上存在的对象。

这里的标准是指 ECMAScript 和其他环境(比如 DOM)的标准。

5.6.2.1 ECMAScript 的内置对象
  1. Boolean
  2. Number
  3. String
  4. Date
  5. RegExp
  6. Error
let b: Boolean = new Boolean(1)
let n: Number = new Number(true)
let s: String = new String('abc')
let d: Date = new Date()
let r: RegExp = /^1/
let e: Error = new Error('error message')
b = true
// let bb: boolean = new Boolean(2)  // error

5.6.2.2 BOM 和 DOM 的内置对象

  • Window
  • Document
  • HTMLElement
  • DocumentFragment
  • Event
  • NodeList
const div: HTMLElement = document.getElementById('test')
const divs: NodeList = document.querySelectorAll('div')
document.addEventListener('click', (event: MouseEvent) => {
  console.dir(event.target)
})

六、typescript 的脚手架

6.1 创建 TS 版本的 react 应用

# 创建项目
create-react-app react-ts --template typescript

# 进入目录
cd react-ts

# 启动服务
npm start

6.2 React V18

import ReactDOM from 'react-dom/client'
import App from './App'

// 创建应用根对象, 指定页面容器元素
const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement)

// 渲染App组件
root.render(<App />)

6.3 React 严格模式

文档: https://zh-hans.reactjs.org/docs/strict-mode.html

在 React 严格模式下, 一些不好的语法使用会在浏览器控制台显示相应的错误提示

只在开发模式下起作用, 生产环境打包时会自动去除

开启 React 严格模式

<React.StrictMode>
	<App/>
</React.StrictMode>

建议在开发阶段, 关闭这个严格模式, 该模式会导致每次输出内容, 弹出两次, 影响调试

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

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

相关文章

四氯化硅铝的活性离子蚀刻

引言 铝膜广泛用于集成电路中的互连线。随着电路的集成规模和密度变得越来越大&#xff0c;有必要将互连线和间隔的宽度减小到几乎薄膜厚度。为了实现这一点&#xff0c;已经开发了具有定向蚀刻能力的平行平面电极型等离子体蚀刻。这被称为反应离子蚀刻&#xff0c;因为它采用…

基于免疫优化算法的物流配送中心选址规划研究(Matlab实现)

目录 1 概述 2 物流配送中心选址规划研究 3 Matlab代码 4 结果 1 概述 影响物流配送中心选址的因素有很多,精确选址优化问题亟待解决。通过充分考虑货物的配送时间,将免疫算法加入其中,介绍了物流配送选址模型的构建以及免疫算法实现的相关步骤,最后利用matlab软件进行分析,提出…

手机端三维人体建模软件-易模,为虚拟现实、游戏开发带来新体验

三维人体建模是一种高级的数字技术&#xff0c;用于将人体的形态、肌肉、骨骼等三维信息转化为数字模型。这项技术涵盖了计算机图像处理、计算机辅助设计等领域&#xff0c;具有广泛的应用价值。通过三维人体建模&#xff0c;可以更好地理解人体的结构和功能&#xff0c;对于医…

弗迪科技携手纷享销客共建CRM系统,数智化升级加速“灯塔工厂”征程

当前&#xff0c;全球新一轮科技革命正和产业升级融合发展&#xff0c;数字化技术成为各行各业升级发展的重要推动力。 自2018年起&#xff0c;世界经济论坛与麦肯锡咨询公司发起“灯塔工厂”项目&#xff0c;全球严选制造业数字化转型典范作为“数字化制造”和“全球化4.0”的…

squid代理服务应用

squid代理服务器 代理的工作机制&#xff1a; 代理服务器的概念及其作用&#xff1a; 其主要作用有&#xff1a; Squid 代理的类型&#xff1a; 安装 Squid 服务 编译安装 Squid 修改 Squid 的配置文件 Squid 的运行控制 创建 Squid 服务脚本 构建传统代理服务器 生产环境…

红黑树:变色旋转规则化抽象逻辑分析

文章目录 一.红黑树的定义红黑树平衡性论证 二.红黑树的节点插入插入新节点后最小违规子结构(抽象分析)最小违规子结构一号的规则化算法分析最小违规子结构二号的规则化算法分析 三.红黑树类代码托管四.红黑树与AVL树的对比 旷世奇才发明的数据结构 一.红黑树的定义 红黑树的节…

【C语言初阶(10)】函数练习题

文章目录 1. 判断素数2. 判断闰年3. 函数实现二分查找4. 记录函数调用次数 1. 判断素数 题目内容 写一个函数可以判断一个数是不是素数。 素数 素数也叫做质数&#xff0c;一个只能被 1 和它本身整除的数字称之为素数。 例如&#xff1a;7 这个数字只能被 1 和 它本身&#x…

赛效:怎么将PPT转为PDF

1&#xff1a;在电脑网页上打开云组件&#xff0c;点击“PPT转换”菜单里的“PPT转PDF”。 2&#xff1a;点击“选择文件”可以将本地PPT文件添加上去。 3&#xff1a;文件添加成功后&#xff0c;点击下方的“开始转换”按钮。 4&#xff1a;文件转换成功后&#xff0c;在预览页…

vue动态修改浏览器标题和logo

问题描述 需要将一个系统&#xff0c;更改一下标题、logo&#xff0c;然后部署成另一个系统&#xff0c;由于不想单独拉出一套代码&#xff08;单独拉出来后维护成本增加&#xff09;&#xff0c;所以想要动态改变系统标题和图标 解决方案 将项目制造一个入口可以修改项目的…

20230703 -- scRNAseq from gastric cancer

文章标题&#xff1a;《Single-cell atlas of lineage states, tumor microenvironment and subtypespecific expression programs in gastric cancer》 DOI: 10.1158/2159-8290.CD-21-0683 数据集组织形式快照&#xff1a; step1 利用Seurat包整合数据 #! conda env R4libra…

Hombrew中AdoptOpenJDK已废弃更换Eclipse Temurin安装最新版JDK,并实现不同JDK版本之间切换

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

Python基础 —— 运算符

每天提升一 。。。。。。 〇、概述 Python 中有很多运算符&#xff0c;大体分为 算数运算符、赋值远算符、比较运算符、逻辑运算符。通过这些运算符能够更好地完成一些列的数据运算。 一、算数运算符 1. 算数运算符 算数运算符 主要用于 数值类型&#xff08;整型、浮点型…

TCP三次和四次握手:

内容来自思学堂&#xff1a; TCP三次握手&#xff1a;确保双方都在线上 TCP四次握手&#xff1a;处理客户端要断开连接的需求

JavaWeb学习路线(11)—— Maven延伸

一、分模块设计 &#xff08;一&#xff09;概念&#xff1a; 将项目按功能拆分出若干个子模块。 &#xff08;二&#xff09;作用&#xff1a; 方便项目管理维护、扩展&#xff0c;也方便模块间相互调用&#xff0c;资源共享。 &#xff08;三&#xff09;具体实现 1、抽取…

深度学习项目实战二: LetNet5网络结构搭建

深度学习项目实战二: LetNet5网络结构搭建 文章目录 深度学习项目实战二: LetNet5网络结构搭建@[TOC](文章目录)一、卷积基本运算公式二、LetNet5网络1. 网络结构![在这里插入图片描述](https://img-blog.csdnimg.cn/0008fe6e5886414eac09eed49556ad99.png)2. 导入相关包3. 代码…

Apikit 自学日记:流程用例

添加普通用例 进入自动化测试用例管理页面&#xff0c;点击 添加用例 按钮&#xff0c;在弹窗中输入用例名称等信息&#xff0c;然后点击确定即可。 发起用例测试 创建好测试用例之后&#xff0c;点击 执行测试 按钮即可运行测试&#xff0c;系统会自动按顺序执行测试流程里的…

汽车下半年行情启动?概念全线爆发

2023年上半年&#xff0c;车市整体的基调是打价格战和加速“内卷”&#xff0c;在资本市场&#xff0c;汽车产业链相关概念股的表现整体也是不温不火。然而&#xff0c;下半年刚开始&#xff0c;汽车产业链股集体高调反弹。 7月4日&#xff0c;A股市场涨幅居前的概念板块几乎全…

MapstructPlus的快速集成

https://www.mapstruct.plus/https://www.mapstruct.plus/ # 博主技术栈如下 springboot:2.4.5 lombok:1.8.20 mapstruct-plus:1.3.4 knife4j:4.0.0目录 一、添加依赖&#xff08;谨防依赖冲突&#xff09; 二、如果依赖下不下来&#xff0c;要在maven的setting文件中加入腾讯…

NSS [SWPUCTF 2021 新生赛]no_wakeup

NSS [SWPUCTF 2021 新生赛]no_wakeup 先看题目&#xff0c;反序列化&#xff0c;绕过weakup。 exp&#xff1a; <?php class HaHaHa{public $admin;public $passwd;public function __construct(){$this->admin "admin";$this->passwd "wllm";…

【Python爬虫开发实战②】使用urllib以及jsonpath爬取即将上映电影信息

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;python网络爬虫从基础到实战 欢迎订阅&#xff01;后面的内容会越来越有意思~ &#x1f4a1;往期推荐&#xff1a; ⭐️首先&#xff0c;我们前面讲了多篇基础内容&…