三、ts高级笔记,

文章目录

  • 18、d.ts声明文件
  • 19、Mixin混入
  • 20、Decorator装饰器的使用
  • 21、-高级proxy拦截_Reflect元储存
  • 22、-高级写法Partial-Pick
  • 23、Readonly只读_Record套对象
  • 24、高阶写法Infer占位符
  • 25、Inter实现提取类型和倒叙递归
  • 26、object、Object、{}的区别
  • 27、localStorage封装
  • 28、协变-逆变-双向协变(赋值操作)
  • 29、Set_Map和WeakSet_WeakMap(es6方法和弱引用)
  • 总结


18、d.ts声明文件

  • 仅了解,需要用到时查文档
//todo  npm  声明文件可用npm 根据提示下载// declare var 声明全局变量
// declare function 声明全局方法
// declare class 声明全局类
// declare enum 声明全局枚举类型
// declare namespace 声明(含有子属性的)全局对象
// interface 和 type 声明全局类型
/// <reference path="./14-泛型.ts"/> 三斜线指令declare module 'express' {interface Router {get(path: string, cb: (req: any, res: any) => void): void}interface App {use(path: string, router: any): voidlisten(port: number, cb?: () => void): void}interface Express {(): AppRouter(): Router}const express: Expressexport default express
}// 导入使用
import express from 'express';
// 对着声明时导出的接口
express.Router().get
express().use

19、Mixin混入

  • Object.getOwnPropertyNames()获取对象自身的属性,除去他继承来的属性,
  • prototype 获取原型
  • class C2 implements A1,A2 继承
//* Mixin 混入//!   1.对象混入interface name{name:string
}
interface name1{age:number
}let na:name={name:'ASD'
}
let na1:name1={age:22
}const nn=Object.assign(na,na1)
console.log(nn);  // { name: 'ASD', age: 22 }//!  2.类的混入class A1 {type: boolean = false;changeType() {this.type = !this.type}
}class A2 {name: string = '张三';getName(): string {return this.name;}
}//?1class C2 implements A1,A2 {type:boolean=falsechangeType(): void {}name: string='张三';getName(): string {return this.name}
}
console.log(Object.getOwnPropertyNames(Object.create(A2).prototype)); // [ 'constructor', 'getName' ]//?2
//获取A1,A2的原型到C2上  prototype原型Mixins(C2, [A1, A2])
function Mixins(curCls:any,itemCls:any[]){itemCls.forEach(item=>{//Object.getOwnPropertyNames()可以获取对象自身的属性,除去他继承来的属性,Object.getOwnPropertyNames(item.prototype).forEach(name=>{curCls.prototype[name]=item.prototype[name]})})
}

20、Decorator装饰器的使用

  • //1.类装饰器 ClassDecorator
  • //2.属性装饰器 PropertyDecorator
  • //3.参数装饰器 ParameterDecorator
  • //4.方法装饰器 MethodDecorator PropertyDescriptor
  • 5.元数据 import ‘reflect-metadata’ 需要安装reflect-metadata使用暂不解释

*需要tsc --init暴露tsconfig.json,并修改里面的experimentalDecorators为true,不然会报错签名无法解析

//1.类装饰器    ClassDecorator
//2.属性装饰器  PropertyDecorator
//3.参数装饰器  ParameterDecorator
//4.方法装饰器  MethodDecorator  PropertyDescriptor
//5.元数据      import 'reflect-metadata'//class类装饰器
const vv:ClassDecorator=(tag:Function)=>{tag.prototype.getTime=<T>(age:T):T=>{return age}
}@vv
class a11{constructor(){}
}
//别名any 否则报错
console.log((new a11() as any).getTime('123'));//装饰器工厂
const vvv=<T>(name?:T):ClassDecorator=>{// console.log(name);return (tag:Function)=>{tag.prototype.getTime=<T>(age:T):T=>{return age}}
}@vvv('asd')
@vvv('asdasd')
@vvv()
class a22{constructor(){}
}
//别名any 否则报错
console.log((new a22() as any).getTime(1223));//方法装饰器  属性装饰器
const met:MethodDecorator=(...args)=>{//方法console.log(args);
}
const pro:PropertyDecorator=(...args)=>{//属性console.log(args);
}
const par:ParameterDecorator=(...args)=>{//参数console.log(args);
}class aaa2{@proname:string = 'ss'constructor(){}@metgetName(@par age:string ='123'):string{return age}
}console.log(new aaa2());
//?方法
// [
//   {},
//   'getName',
//   {
//     value: [Function: getName],
//     writable: true,      是否可读写
//     enumerable: false,   是否可枚举
//     configurable: true   是否可配置
//   }
// ]//?属性   [ {}, 'name', undefined ]
//       构造函数或实例 名字  //?参数   [ {}, 'getName', 0 ]
//       构造函数或实例 名字  索引

21、-高级proxy拦截_Reflect元储存

/****! Proxy 拦截器   *! Reflect 元存储
*/let xxx={name:'yang',age:18
}const namexxx = (Y:any)=>{return new Proxy(Y,{//拦截对象的读取get(target,key,receiver){//获取return Reflect.get(target,key,receiver)},  //拦截对象设置            set(target,key,value,receiver){//设置    return Reflect.set(target,key,value,receiver)},	  //'eyeCount' in targetObj // true has(target,key){// 检查是否含有该属性return Reflect.has(target,key)},	          //拦截对象删除该属性deleteProperty(target,key){//删除该属性return Reflect.deleteProperty(target,key)},	     //获取原型getPrototypeOf(target){return Reflect.getPrototypeOf(target)},	 //设置原型 并删除原来的 setPrototypeOf(target,proto){//proto 原型方法return Reflect.setPrototypeOf(target,proto)},	        //不可扩展对象isExtensible(target){return Reflect.isExtensible(target)},	  /*** 判断该对象是否可扩展*/preventExtensions(target){return Reflect.preventExtensions(target)},	     //返回对象属性的描述符   可读、枚举、配置1等getOwnPropertyDescriptor(target,key){return Reflect.getOwnPropertyDescriptor(target,key)},//修改对象属性描述属性配置defineProperty(target,key,proto){return Reflect.deleteProperty(target,key)},    //返回对象键的数组格式ownKeys(target){return Reflect.ownKeys(target)},	   //拦截函数的调用apply(target,Arg,Array){return Reflect.apply(target,Arg,Array)},	          //拦截new操作符construct(target,array){return Reflect.construct(target,array)},             })
}
namexxx(xxx)//元储存
let Y={name:"人",age:'asd'
}class qa{get(){console.log('asdasd');}
}const aq={
name:'22',
get(){console.log(this.name);
}
}let attributes ={ value: '样',writable: true,enumerable: true,configurable: true}/**
**    Reflect.get(Y,)	                         获取对象身上某个属性的值
**    Reflect.set()	                         在对象上设置属性
**    Reflect.has()	                         判断一个对象是否存在某个属性
**    Reflect.deleteProperty()	               删除对象上的属性
**    Reflect.getPrototypeOf()	               获取指定对象原型的函数
**    Reflect.setPrototypeOf()	               设置或改变对象原型的函数
**    Reflect.isExtensible()	                 判断一个对象是否可扩展 (即是否能够添加新的属性)
**    Reflect.preventExtensions()	           阻止新属性添加到对象
**    Reflect.getOwnPropertyDescriptor()	     获取给定属性的属性描述符
**    Reflect.defineProperty()          	     定义或修改一个对象的属性
**    Reflect.ownKeys()	                     返回由目标对象自身的属性键组成的数组
**    Reflect.apply()	                       对一个函数进行调用操作,同时可以传入一个数组作为调用参数
**    Reflect.construct()	                   对构造函数进行 new操作,实现创建类的实例* **///获取
Reflect.get(Y,'age')	                 //设置
Reflect.set(Y,'age','111')	   
console.log(Reflect.set(Y,'age','111')	);//true//检查是否含有该属性
Reflect.has(Y,'name')	 
console.log(Reflect.has(Y,'name')	);//true//删除该属性
Reflect.deleteProperty(Y,'age')	
console.log(Reflect.deleteProperty(Y,'age')	);//true//获取原型
Reflect.getPrototypeOf(Y)//设置原型 并删除原来的   
Reflect.setPrototypeOf(Y,qa)	 
console.log((Y as any).prototype);  //{}//不可扩展对象
Reflect.isExtensible(Y)	           //判断该对象是否可扩展
Reflect.preventExtensions(Y)	     //返回对象属性的描述符   可读、枚举、配置1等
Reflect.getOwnPropertyDescriptor(Y,'name')
console.log(Reflect.getOwnPropertyDescriptor(Y,'name'));//{ value: '人', writable: true, enumerable: true, configurable: true }//修改对象属性描述属性配置
Reflect.defineProperty(Y,'name',attributes)
console.log(Y);   //attributes{ value: '人', writable: true, enumerable: true, configurable: true }//返回对象键的数组格式
Reflect.ownKeys(Y)	 //对一个函数进行调用操作,同时可以传入一个数组作为
Reflect.apply(aq.get,aq,[1,2,3])	                 
console.log( Reflect.apply(aq.get,aq, [1,2,3]));//
function Person12 (name:string, hobby:string){
console.log(`${name}喜欢${hobby}`);
return `${name}喜欢${hobby}`
}// 对构造函数进行 new操作,实现创建类的实例
const person = Reflect.construct(Person12, ['一碗周','coding'],Person12)/** 
*!    总结
*!    Reflect对象提供哪些静态方法,都是可以通过另一种方式来完成的,那为什么还要提供一个Reflect对象呢?
*!    
*!    这是因为前面的那十三种操作,可能来自不同的对象里面的方法,有全局的、有Object的、有Function的,但是提供了Reflect对象之后就将前面所有的操作统一到了一个对象下面 ,也统一了操作方式 。

22、-高级写法Partial-Pick

Partial 设置所有属性为可选
Pick 返回一个新定义的类型

//*进阶用法 Partial   Pick
/*** Make all properties in T optional* 将T中的所有属性设置为可选* 与ts自带的Partial冲突才加的Partialed,可直接使用Partial*/type Partialed<T> = {[P in keyof T]?: T[P];
};type PersonS = {name:string,text:stringage:number
}/*** 转换后全部属性为可选 keyof取出属性变成联合类型  ,* in类似for in遍历   ,* ?变为可选,* T[P]索引访问,**/
type p =Partialed<PersonS>//!
/*** From T, pick a set of properties whose keys are in the union K,* 从类型定义T的属性中,选取指定一组属性,返回一个新的类型定义。* 返回"text" | "age" 并组成新类型定义* 与ts自带的Pick冲突才加的Picked,可直接使用Pick*/
type Picked<T, K extends keyof T> = {[P in K]: T[P];
};type Ex = "text" | "age"type C =Picked<PersonS,Ex>

23、Readonly只读_Record套对象

Readonly 结合Partial使对象等变为只读
Record 返回一个对象包裹的键值对

//  Readonly 只读  Record 套一层对象/*** !Readonly* Make all properties in T optional* 将T中的所有属性设置为只读* 与ts自带的Partial冲突才加的Partialeds,可直接使用Partial*/type Partialeds<T> = {readonly [P in keyof T]: T[P];
};type Personed = {name:string,text:stringage:number
}/*** 转换后全部属性为只读 keyof取出属性变成再声明为只读,* in类似for in遍历   ,* readonly变为只读,* T[P]索引访问,**/
type ps =Partialeds<Personed>/*** ! Record ,* * 作用:返回一个自定义的键包裹类型定义* 0:{*   name:"",*   text:'',*   age:1* }* 限制键值对**/ type Records<K extends keyof any, T>={[P in K]:T}type sa=Records<0,Personed>let ssss:sa={0:{name:"",text:'',age:1}}

24、高阶写法Infer占位符

// infer的作用 新增的关键字-用于占位符
// 需求:定义一个类型 如果是数组类型 就返回 数组元素的类型 否则 就传入什么类型 就返回什么类型
// 01:简单的定义 数组
type TYPE<T> = T extends Array<any> ? T[number] : T;
type AAAA = TYPE<string[]>;
let aaaa: AAAA = "111";type BBBB = TYPE<boolean>;
let bbbb: BBBB = true;// 02:使用infer U做占位符
type TYPE2<T> = T extends Array<infer U> ? U : T;
type AAAA2 = TYPE2<(string | number)[]>;
let aaaa2: AAAA2 = 1;type BBBB2 = TYPE2<boolean>;
let bbbb2: BBBB2 = true;// 03:使用infer U做占位符 - 联合类型
type TYPE3<T> = T extends Array<infer U> ? U : never;
type TTTT = [number, string];
type uni = TYPE3<TTTT>; // type uni = string | number
type uni2 = TYPE3<boolean>; // type uni2 = never// 04:使用infer U做占位符 - 提取数组之中的某一项元素
type Arr = ["a", "b", "c"];
// 04-1 提取第一项
type First<T extends any[]> = T extends [infer one, infer two, ...any[]]? one // one => type a = "a"; two type a = "b";: [];
type a = First<Arr>; // type a = "a"// 04-2 提取最后一项
type Last<T extends any[]> = T extends [...any[], infer Last] ? Last : [];
type b = Last<Arr>; // type b = "c"// 04-3 删除最后面一项
type Pop<T extends any[]> = T extends [...infer Rest, infer Last] ? Rest : [];
type c = Pop<Arr>; // type c = ["a", "b"]// 04-3 删除最前面一项
type Shif<T extends any[]> = T extends [infer Last, ...infer Rest] ? Rest : [];
type d = Shif<Arr>; // type d =  ["b", "c"]// 05:使用infer U做占位符 - infer递归 ( 翻转数组 )
type Arr2 = [1, 2, 3, 4];
type ReverArr<T extends any[]> = T extends [infer First, ...infer Rest] ? [...ReverArr<Rest>,First] : T;
type ArrRever = ReverArr<Arr2> // type ArrRever = [4, 3, 2, 1]

25、Inter实现提取类型和倒叙递归

//类型提取 Infer type Arrs = ['a','b','c']/*** 返回头或尾*/
type First<T extends any[]> =  T extends [...any[],infer First] ? First : []  /** * 返回删除头或尾后的数组* unknown声明
*/
type Firsts<T extends any[]> =  T extends [...infer First,unknown] ? First : []
type a = First<Arrs>
type aa = Firsts<Arrs>//Infer  递归用法//*倒叙
type Arr = [1, 2, 3, 4]/*** [infer First, ...infer rest]  [...ReveArr<rest>, First]* 将第一个First放在后面,反复调用每次会自动减少
*/
type ReveArr<T extends any[]> = T extends [infer First, ...infer rest] ?[...ReveArr<rest>, First] : Ttype Res = ReveArr<Arr>  // [4, 3, 2, 1]

26、object、Object、{}的区别

//object、Object 以及{}的区别用法/*** !  object 是一个表示非原始类型的类型。它可以包括任何非原始类型,如数组、函数、对象等。* !  Object 是 JavaScript 中的内置对象,它是所有对象的基类。* !  {} 是一种简写形式,表示一个空对象。在 TypeScript 中,{} 可以用作类型注解,表示一个空对象类型。
*//*** * object 表示对象类型  * */ 
let a1:object={}/*** *Object是JS的内置对象,表示所有对象的原型顶层 
*/
let a2:Object= Object/*** *{}空对象,类型和Object一样在ts里面 没有Object的方法属性
*/
let a3={}

27、localStorage封装

let a = new Date().toLocaleString()interface time{outtme:string
}type Key=stringinterface Result { //返回值类型message: string,value: object
}interface setvalue{set:<T>(key:Key,value:T,time?:number)=>voidget:<T>(key:Key)=>voidremove:(key:Key)=>voidclear:()=>void
}
interface vas{value:Objecttime?:number
}
enum out{yes,no
}
class Storages implements setvalue{get(key:Key){if(key){let keys= JSON.parse(localStorage.getItem(key) as string)console.log();if(new Date().getTime() / 1000 < keys.value){return keys}else{return{message:`已过期,请重新设置`,}}}} set(key:Key,value:any,time?:out|number){if(value!=undefined && value!=null ){let va ={value:value,time:(typeof time=='number'?time:0) +Number(new Date().getTime()) / 1000  //毫秒转秒}if(time!=0){localStorage.setItem(key,JSON.stringify(va))return{message:`过期设置`,value:value}}else if(time==0){localStorage.setItem(key,JSON.stringify(va))return{message:`永不过期设置`,value:value}}}else{return {message:`设置${key}错误,是个空值或或没声明的值`}}}remove(key:Key){localStorage.removeItem(key)}clear(){localStorage.clear()}
}
const times =new Storages()
console.log(times.set('start',123,21));
console.log(times.get('start'));

28、协变-逆变-双向协变(赋值操作)

//!协变//当属性多的一个包含属性少的变量时,可以产生协变  赋值操作//*多赋少interface A {name:string
}interface B {name:stringage:numbersex:string
}let a:A = {name:"老墨我想吃鱼了",
}let b:B = {name:"老墨我不想吃鱼",age:33,sex:"女"
}a = bconsole.log(a);
console.log(b);//!逆变//函数上 函数赋值 少赋多let fna = (params:A) => {}
let fnb = (params:B) => {}// fna = fnb //错误fnb = fna //正确//!双向协变//设置tsconfig.json   属性strictFunctionTypes=false,可进行双向赋值操作 双向协变

29、Set_Map和WeakSet_WeakMap(es6方法和弱引用)

//!weakMap,weakSet,set,map//1.set 集合//add(value):添加某个值,返回 Set 结构本身。
//
//delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
//
//has(value):返回一个布尔值,表示该值是否为 Set 的成员。
//
//clear():清除所有成员,无返回值。
//
//size : 返回set数据结构的数据长度 let a= new Set()
a.add('sasd')
//去重    配合扩展运算符可以去重
let b= [...new Set(['asdsa','asd'])]//2.map 它类似于对象,也是键值对的集合let c= new Map()caches.delete('asd')
c.has('s')//查询是否有's'
c.clear()
c.get('ad')
c.set('asd','asd')
c.size//WeakSet 和 WeakMap  当不引用是
//WeakSet的成员只能是对象,WeakMap只接受对象(null除外)作为键名       
//不计入垃圾回收机制    
//没有遍历操作,没有size属性,没有clear方法
//不需要时会自动GC回收
//可以放其他东西,dom 函数等, 不用回自动回收掉let obj:any = {name:'小满zs'} //1
let aahph:any = obj //2
let wmap:WeakMap<object,string> = new WeakMap()wmap.set(obj,'爱安徽潘慧') //2 他的键是弱引用不会计数的obj = null // -1
aahph = null;//-1
//v8 GC 不稳定 最少200mssetTimeout(()=>{console.log(wmap)
},500)

总结

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

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

相关文章

基于 STM32F7 和神经网络的实时人脸特征提取与匹配算法实现

本文讨论了如何使用 STM32F7 和神经网络模型来实现实时人脸特征提取与匹配算法。首先介绍了 STM32F7 的硬件和软件特点&#xff0c;然后讨论了人脸特征提取和匹配算法的基本原理。接下来&#xff0c;我们将重点讨论如何在 STM32F7 上实现基于神经网络的人脸特征提取与匹配算法&…

微机原理_3

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案,请将选定的答案填涂在答题纸的相应位置上。) 在 8086 微机系统中&#xff0c;完成对指令译码操作功能的部件是&#xff08;)。 A. EU B. BIU C. SRAM D. DRAM 使计算机执行某…

【机器学习】聚类(一):原型聚类:K-means聚类

文章目录 一、实验介绍1. 算法流程2. 算法解释3. 算法特点4. 应用场景5. 注意事项 二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. Kmeans类a. 构造函数b. 闵可夫斯基距离c. 初始化簇心d. K-means聚类e. 聚类结果可视化 2. 辅助函数3. 主函数a. 命令…

ElasticSearch之虚拟内存

查看当前Linux系统中vm.max_map_count变量的值&#xff0c;命令如下&#xff1a; sysctl vm.max_map_count执行结果的样例&#xff0c;如下&#xff1a; vm.max_map_count 65530修改参数vm.max_map_count的值&#xff0c;命令如下&#xff1a; sysctl -w vm.max_map_count2…

数组题目: 665. 非递减数列、453. 最小移动次数使数组元素相等、283. 移动零、189. 旋转数组、396. 旋转函数

665. 非递减数列 题解&#xff1a; 题目要求一个非递减数列&#xff0c;我们可以考虑需要更改的情况&#xff1a; nums {4, 2, 5} 对于这个nums&#xff0c;由于2的出现导致非递减&#xff0c;更改的情况就是要么4调到<2&#xff0c;要么2调到4,5. nums {1, 4, 2, 5} …

人工智能-注意力机制之注意力汇聚:Nadaraya-Watson 核回归

查询&#xff08;自主提示&#xff09;和键&#xff08;非自主提示&#xff09;之间的交互形成了注意力汇聚&#xff1b; 注意力汇聚有选择地聚合了值&#xff08;感官输入&#xff09;以生成最终的输出。 本节将介绍注意力汇聚的更多细节&#xff0c; 以便从宏观上了解注意力机…

Lubuntu 23.10用户可使用LXQt 1.4桌面

导读在众多 Lubuntu 用户的要求下&#xff0c;Lubuntu 开发人员决定将 LXQt 1.4 桌面环境向后移植到最新的 Lubuntu 23.10 &#xff08;Mantic Minotaur&#xff09; 版本。 是的&#xff0c;您没看错&#xff0c;您现在可以使用官方的 Lubuntu Backports PPA&#xff08;个人软…

黑马点评笔记 分布式锁

文章目录 分布式锁基本原理和实现方式对比Redis分布式锁的实现核心思路实现分布式锁版本一Redis分布式锁误删情况说明解决Redis分布式锁误删问题分布式锁的原子性问题分布式锁-Redission分布式锁-redission可重入锁原理分布式锁-redission锁重试和WatchDog机制分布式锁-redissi…

01、Tensorflow实现二元手写数字识别

01、Tensorflow实现二元手写数字识别&#xff08;二分类问题&#xff09; 开始学习机器学习啦&#xff0c;已经把吴恩达的课全部刷完了&#xff0c;现在开始熟悉一下复现代码。对这个手写数字实部比较感兴趣&#xff0c;作为入门的素材非常合适。 基于Tensorflow 2.10.0 1、…

pandas获取年月第一天、最后一天,加一秒、加一天、午夜时间

Timestamp对象 # ts = pandas.Timestamp(year=2023, month=10, day=15, # hour=15, minute=5, second=50, tz="Asia/Shanghai") ts = pandas.Timestamp("2023-10-15 15:05:50", tz="Asia/Shanghai") # 2023-10-15 15:05…

数据丢失预防措施包括什么

数据丢失预防措施是保护企业或个人重要数据的重要手段。以下是一些有效的预防措施&#xff1a; 可以通过域之盾软件来实现数据防丢失&#xff0c;具体的功能包括&#xff1a; https://www.yuzhidun.cn/https://www.yuzhidun.cn/ 1、备份数据 定期备份所有重要数据&#xff0…

unittest指南——不拼花哨,只拼实用

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

centos7 docker开启认证的远程端口2376配置

docker开启2375会存在安全漏洞 暴露了2375端口的Docker主机。因为没有任何加密和认证过程&#xff0c;知道了主机IP以后&#xff0c;&#xff0c;任何人都可以管理这台主机上的容器和镜像&#xff0c;以前贪图方便&#xff0c;只开启了没有认证的docker2375端口&#xff0c;后…

代码随想录算法训练营第五十三天|1143.最长公共子序列 1035.不相交的线 53. 最大子序和

文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;代码随想录B站账号 状态&#xff1a;看了视频题解和文章解析后做出来了 1143.最长公共子序列 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:dp [[0] * (len(text2) 1) for _ i…

机器学习入门

简介 https://huggingface.co/是一个AI社区&#xff0c;类似于github的地位。它开源了许多机器学习需要的基础组件如&#xff1a;Transformers, Tokenizers等。 许多公司也在不断地往上面提交新的模型和数据集&#xff0c;利用它你可以获取以下内容&#xff1a; Datasets : 数…

hikariCP 数据库连接池配置

springBoot 项目默认自动使用 HikariCP &#xff0c;HikariCP 的性能比 alibaba/druid快。 一、背景 系统中多少个线程在进行与数据库有关的工作&#xff1f;其中&#xff0c;而多少个线程正在执行 SQL 语句&#xff1f;这可以让我们评估数据库是不是系统瓶颈。 多少个线程在…

基于法医调查算法优化概率神经网络PNN的分类预测 - 附代码

基于法医调查算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于法医调查算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于法医调查优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

【学生成绩管理】数据库示例数据(MySQL代码)

【学生成绩管理】数据库示例数据&#xff08;MySQL代码&#xff09; 目录 【学生成绩管理】数据库示例数据&#xff08;MySQL代码&#xff09;一、创建数据库二、创建dept&#xff08;学院&#xff09;表1、创建表结构2、添加示例数据3、查看表中数据 三、创建stu&#xff08;学…

35.逻辑运算符

目录 一.什么是逻辑运算符 二.C语言中的逻辑运算符 三.逻辑表达式 三.视频教程 一.什么是逻辑运算符 同时对俩个或者俩个以上的表达式进行判断的运算符叫做逻辑运算符。 举例&#xff1a;比如去网吧上网&#xff0c;只有年满十八周岁并且带身份证才可以上网。在C语言中如果…

为什么 Flink 抛弃了 Scala

曾经红遍一时的Scala 想当初Spark横空出世之后&#xff0c;Scala简直就是语言界的一颗璀璨新星&#xff0c;惹得大家纷纷侧目&#xff0c;连Kafka这类技术框架也选择用Scala语言进行开发重构。 可如今&#xff0c;Flink竟然公开宣布弃用Scala 在Flink1.18的官方文档里&#x…