TypeScript(四)枚举类型(Enum Types),类型别名(Type),运算符

news2025/1/17 0:49:16

一、枚举类型

使用枚举我们可以定义一些带名字的常量。 使用枚举可以清晰地表达意图或创建一组有区别的用例。 TypeScript支持数字的和基于字符串的枚举。
枚举类型的特点

  • 可以给一组数值取上一个更好理解的名字;
  • 一个枚举中只会存在几个固定的值,并不会出现超出范围的可能性;
    在很多编程语言中都会有枚举这种数据结构,但是在 JavaScript 中没有这种枚举数据结构,很多时候都是用一个对象来模拟枚举,如下:
    const PostStatus = {
      name: '迪西',
      age: 9,
      className: '三年级'
    }
    
    在 Typescript 当中可以用 enum 关键词声明一个枚举,{ } 里面是枚举的值,注意的是用 = 号,使用方式跟对象一样。
    enum PostStatus {
      name = '迪西',
      age = 9,
      className = '三年级'
    }
    
  1. 数字枚举
    枚举值自动基于前一个值自增,如果没指定具体数值,则从 0 开始。
    enum PostStatus1 {
      Draft,
      Draft1 = 5, 
      Draft2 = 7,
      Draft3
    }
    console.log(PostStatus1.Draft) // 0
    console.log(PostStatus1.Draft1) // 5
    console.log(PostStatus1.Draft2) // 7
    console.log(PostStatus1.Draft3) // 8
    
  2. 字符串枚举
    字符串枚举无法自增,需要手动添加,字符串枚举不太常见, 如果不添加会报错。
    enum PostStatus1 {
      Str = 'a',
      Str1 = 'b', 
      Str2 = 'c',
      Str3 = 'd',
    }
    console.log(PostStatus1.Str) // a
    console.log(PostStatus1.Str1) // b
    console.log(PostStatus1.Str2) // c
    console.log(PostStatus1.Str3) // d
    
    在这里插入图片描述
  3. 计算的和常量成员
    每个枚举成员都带有一个值,它可以是 常量或 计算出来的。 当满足如下条件时,枚举成员被当作是常量:
    • 它是枚举的第一个成员且没有初始化器,这种情况下它被赋予值 0:
    enum PostStatus1 {
      Draft,
    }
    console.log(PostStatus1.Draft) // 0
    
    • 它不带有初始化器且它之前的枚举成员是一个 数字常量。 这种情况下,当前枚举成员的值为它上一个枚举成员的值加1。
    enum PostStatus1 {
      Draft = 1,
      Draft1, 
      Draft2,
    }
    console.log(PostStatus1.Draft) // 1
    console.log(PostStatus1.Draft1) // 2
    console.log(PostStatus1.Draft2) // 3
    
    • 枚举成员使用 常量枚举表达式初始化。 常数枚举表达式是TypeScript表达式的子集,它可以在编译阶段求值。 当一个表达式满足下面条件之一时,它就是一个常量枚举表达式:
      ①: 一个枚举表达式字面量(主要是字符串字面量或数字字面量)
      ②: 一个对之前定义的常量枚举成员的引用(可以是在不同的枚举类型中定义的)
      ③: 带括号的常量枚举表达式
      ④: 一元运算符 +, -, ~其中之一应用在了常量枚举表达式
      ⑤: 常量枚举表达式做为二元运算符 +, -, *, /, %, <<, >>, >>>, &, |, ^的操作对象。 若常数枚举表达式求值后为 NaN或 Infinity,则会在编译阶段报错。
    enum FileAccess {
      None,
      Read  = 1 << 1,
      Write = 1 << 2,
      ReadWrite  = Read | Write,
      G = "123".length
    }
    console.log(FileAccess.None) // 0
    console.log(FileAccess.Read) // 2
    console.log(FileAccess.Write) // 4
    console.log(FileAccess.ReadWrite) // 6
    console.log(FileAccess.G) // 3
    
    所有其它情况的枚举成员被当作是需要计算得出的值。
  4. 常量枚举
    如果我们确认我们代码中不会使用索引器的方式去访问枚举,那推荐使用常量枚举,常量枚举:enum 前面加个关键词 const。
    const enum Enum {
        A = 1,
        B = A * 2
    }
    
    常量枚举只能使用常量枚举表达式,并且不同于常规的枚举,它们在编译阶段会被删除。 常量枚举成员在使用的地方会被内联进来。 之所以可以这么做是因为,常量枚举不允许包含计算成员。
    编译前
    const enum Directions {
        Up,
        Down,
        Left,
        Right
    }
    let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]
    
    编译后
    var directions = [0 /* Directions.Up */, 1 /* Directions.Down */, 2 /* Directions.Left */, 3 /* Directions.Right */];
    
  5. 枚举类型会影响编译结果
    枚举类型会入侵到运行时的代码,也就是说它会影响编译后的结果,会编译成一个双向的键值对对象,目的是可以让我们动态的根据枚举值去或者枚举的名称,也就是说可以通过索引器的方式去访问对应的枚举名称。
    编译前
    enum Directions {
      Up,
      Down,
      Left,
      Right
    }
    
    const post = {
      title: 'Hello TypeScript',
      content: 'TypeScript is a typed superset of JavaScript.',
      positionUp: Directions.Up
    }
    
    编译后
    var Directions;
    (function (Directions) {
        Directions[Directions["Up"] = 0] = "Up";
        Directions[Directions["Down"] = 1] = "Down";
        Directions[Directions["Left"] = 2] = "Left";
        Directions[Directions["Right"] = 3] = "Right";
    })(Directions || (Directions = {}));
    var post = {
        title: 'Hello TypeScript',
        content: 'TypeScript is a typed superset of JavaScript.',
        positionUp: Directions.Up
    };
    

二、Type 类型别名

Type又叫类型别名(type alias),作用是给一个类型起一个新名字,
不仅支持interface定义的对象结构,还支持基本类型、联合类型、交叉类型、元组等任何你需要手写的类型。

type num = number; // 基本类型
type stringOrNum = string | number; // 联合类型
type person = {name: string}; // 对象类型
type user = person & { age: number } // 交叉类型
type data = [string, number]; // 元组
type fun = () => void; // 函数类型
  1. type和interface的相同点:
    • 都可以用来描述一个对象或者函数
      interface
    interface user {name: string; age:number}; // 对象
    interface setUser {(name: string; age:number):void}; // 函数
    
    type
    type user = {name: string; age:number}; // 对象 
    type setUser = (name: string; age:number):void;//函数
    
    • 都可以进行拓展
      interface可以扩展,
    interface userName {
     name: string;
    }
    interface user extends userName {
     age: number
    }
    let stu:user = {name: 'wang', age: 10}
    
    type可以通过交叉实现interface的extends行为
    type userName = {
       name: string;
    }
    type user = userName & {age: number}
    let stu:user = {name: 'wang', age: 18}
    
    interface可以extends type,
    type name = {
      name: string;
    }
    interface user extends name {
      age: number;
    }
    let stu:user = {name: 'wang', age: 89}
    
    type也可以与interface类型交叉 。
    interface name {
      name: string;
    }
    type user = name & {
      age: number;
    }
    let stu:user = {name:'wang', age: 18}
    
  2. type和interface的不同点:
    • type可以做到而interface不能做到
      type可以声明基本类型
    type name = string;
    
    type可以声明联合类型
    type name = string | number;
    
    type可以声明元祖类型
    type infoList = [string, number];
    
    type可以通过typeof操作符来声明
    type typeObj = typeof someObj;
    
    • interface 可以做到而 type 不能做到
      interface 可以声明合并。
    
    interface info {
        name: string
    }
    interface info {
        age: number
    }
    /*
        info 实际为 {
            name: string
            age: number
        }
    */
    
    如果是 type 的话,就会报重复定义的警告,因此是无法实现声明合并的。
    在这里插入图片描述
  3. 使用建议
  • 推荐使用 interface,其他无法满足需求的情况下用 type。但是因为联合类型和交叉类型是比较常用的,所以避免不了大量使用 type 的场景,一些复杂类型也需要通过组装后形成类型别名来使用。
  • 如果想保持代码统一,还是可选择使用 type。通过上面的对比,type 其实可涵盖 interface 的大部分场景。
  • 对于 React 或Vue 组件中 props 及 state,推荐使用 type,这样能够保证使用组件的地方不能随意在上面添加属性。如果有自定义需求,可通过 HOC(高阶组件)二次封装。
  • 编写三方库时使推荐使用 interface,其更加灵活自动的类型合并可应对未知的复杂使用场景。

三、运算符

运算符用于执行程序代码运算

  1. 算术运算符
    算术运算符用于对数字进行基本的算术计算。
    假设:x = 5

    运算符描述例子x运算结果y运算结果
    +加法(用于将两个数字相加。)y=x+5510
    -减法(用于从一个数字中减去另一个数字。)y=x-253
    *乘法(用于将两个数字相乘。)y=x*2510
    /除法(用于将一个数字除以另一个数字。)y=15/x53
    %取模(余数)(用于计算一个数字除以另一个数字后的余数。)y=x%251
    ++自增 (用于将一个数字增加 1。)y = x++55
    ++自增y= ++x56
    - -自减(用于将一个数字减少 1)y= x–55
    - -自减y= --x54

    注:在进行自增(++)的运算时,如果运算符(++)放在操作数的前面是先进行自增运算,再进行其他运算。
    若是运算符放在操作数的后面则是先进行其他运算再进行自增运算。同理可知自减(–)运算亦是如此。

    //	加法
    // const x:number = 5;
    // let y:number = x + 5
    // console.log(y) // 10
    
    // 减法
    // const x:number = 5;
    // let y:number = x - 2
    // console.log(y) // 3
    
    // 乘法
    // const x:number = 5;
    // let y:number = x * 2
    // console.log(y) // 10
    
    // 除法
    // const x:number = 5;
    // let y:number = 15 / x
    // console.log(y) // 3
    
    // 取模(余数)
    // const x:number = 5;
    // let y:number = x%2
    // console.log(y) // 1
    
    // 自增 ++在后
    // let x:number = 5;
    // let y:number = x++;
    // console.log(y) // 5
    // 自增 ++在前
    // let x:number = 5;
    // let y:number = ++x;
    // console.log(y) // 6
    
    //两个++联用
    // let x:number = 5;
    // let y:number = x++;
    // y = ++x;
    // console.log(y) // 7
    
    // let x:number = 5;
    // let y:number = ++x;
    // y = x++;
    // console.log(y) // 6
    
    // -- 在后
    // let x:number = 5;
    // let y:number = x--;
    // console.log(y) // 5
    // -- 在前
    // let x:number = 5;
    // let y:number = --x;
    // console.log(y) // 4
    
  2. 逻辑运算符
    逻辑运算符用于测定变量或值之间的逻辑 并生成布尔值结果。
    给定 x=6 以及 y=3,下表解释了逻辑运算符:

    运算符描述例子
    &&(并且)用于在两个条件都为真时返回真。(x < 10 && y > 1)为 true
    2个竖线(这里表达不出来)(或者 )用于在至少一个条件为真时返回真。(x5 或者 y5) 为 false
    ! (非)用于对表达式取反。!(x==y) 为 true
    // && 并且
    // let a: number = 10;
    // let b: number = 6;
    // let result: boolean = a > 8 && b > 5; 
    // console.log(result) // true
    
    // || 或者
    // let a: number = 10;
    // let b: number = 6;
    // let result: boolean = a > 8 || b > 7;  // a大于8或者b大于7 有一个就返回true
    // console.log(result) // true
    
    // !非
    // let a: number = 10;
    // let b: number = 6;
    // let result: boolean = !(a == b); 
    // console.log(result) // true
    
  3. 关系运算符
    关系运算符用于计算结果是否为 true 或者 false。

    运算符描述比较返回值
    ==(相等)用于比较两个值是否相等。(5 == 8)false
    !=(不等)用于比较两个值是否不相等。(5 != 8)true
    > (大于)用于判断左边的值是否大于右边的值。(5 > 8)false
    < (小于)用于判断左边的值是否小于右边的值。(5 < 8)true
    >=(大于等于)用于判断左边的值是否大于等于右边的值。(5 >= 8)false
    <= (小于等于)用于判断左边的值是否小于等于右边的值。(5 <= 8)true
    var num1:number = 5;
    var num2:number = 9;
     
    console.log("num1 的值为: "+num1); // num1 的值为: 5
    console.log("num2 的值为:"+num2); // num2 的值为:9
     
    var res = num1>num2 
    console.log("num1 大于n num2: "+res) // num1 大于n num2: false
     
    res = num1<num2 
    console.log("num1 小于 num2: "+res)  // num1 小于 num2: true
     
    res = num1>=num2 
    console.log("num1 大于或等于  num2: "+res) // num1 大于或等于  num2: false
     
    res = num1<=num2
    console.log("num1 小于或等于 num2: "+res)   // num1 小于或等于 num2: true
     
    res = num1==num2 
    console.log("num1 等于 num2: "+res)  // num1 等于 num2: false
     
    res = num1!=num2  
    console.log("num1 不等于 num2: "+res) // num1 不等于 num2: true
    
  4. 位运算符
    位操作是程序设计中对位模式按位或二进制数的一元和二元操作。

    运算符描述例子类似于结果十进制
    &AND,按位与处理两个长度相同的二进制数,两个相应的二进位都为 1,该位的结果值才为 1,否则为 0。x = 5 & 10101 & 000100011
    竖线OR,按位或处理两个长度相同的二进制数,两个相应的二进位中只要有一个为 1,该位的结果值为 1。x = 5 竖线 10101 & 000101011
    ~取反,取反是一元运算符,对一个二进制数的每一位执行逻辑反操作。使数字 1 成为 0,0 成为 1。x = ~ 5~01011010-6
    ^异或,按位异或运算,对等长二进制模式按位或二进制数的每一位执行逻辑异按位或操作。操作的结果是如果某位不同则该位为 1,否则该位为 0。x = 5 ^ 10101 ^ 000101004
    <<左移,把 << 左边的运算数的各二进位全部左移若干位,由 << 右边的数指定移动的位数,高位丢弃,低位补 0。x = 5 << 10101 << 1101010
    >>右移,把 >> 左边的运算数的各二进位全部右移若干位,>> 右边的数指定移动的位数。x = 5 >> 10101 >> 100102
    >>>无符号右移,与有符号右移位类似,除了左边一律使用0 补位。x = 2 >>> 10010 >>> 100011
    var a:number = 2;   // 二进制 10 
    var b:number = 3;   // 二进制 11
        
    var result; 
            
    result = (a & b);     
    console.log("(a & b) => ",result) // (a & b) =>  2
                
    result = (a | b);          
    console.log("(a | b) => ",result)  // (a | b) =>  3
            
    result = (a ^ b);  
    console.log("(a ^ b) => ",result); // (a ^ b) =>  1
        
    result = (~b); 
    console.log("(~b) => ",result); // (~b) =>  -4
     
    result = (a << b); 
    console.log("(a << b) => ",result); // (a << b) =>  16
     
    result = (a >> b); 
    console.log("(a >> b) => ",result); // (a >> b) =>  0
     
    result = (a >>> 1); 
    console.log("(a >>> 1) => ",result); // (a >>> 1) =>  1
    
  5. 赋值运算符
    赋值运算符用于给变量赋值。
    给定 x=10 和 y=5,下面的表格解释了赋值运算符:

    运算符描述例子范例x值
    =(赋值)用于将右边的值赋给左边的变量x = yx = yx=5
    +=(先进行加运算后赋值)用于将右边的值与左边的变量相加,并将结果赋给左边的变量。x += yx = x + yx = 15
    -=(先进行减运算后赋值)用于将右边的值从左边的变量中减去,并将结果赋给左边的变量。x -= yx = x - yx = 5
    *=(先进行乘运算后赋值)用于将右边的值与左边的变量相乘,并将结果赋给左边的变量。x *= yx = x * yx = 50
    /= (先进行除运算后赋值)用于将左边的变量除以右边的值,并将结果赋给左边的变量。x /= yx = x / yx = 2

    类似的逻辑运算符也可以与赋值运算符联合使用:<<=, >>=, >>=, &=, |= 与 ^=。

    var a: number = 12 
    var b:number = 10  
     
    a = b 
    console.log("a = b: "+a) // a = b: 10
     
    a += b
    console.log("a+=b: "+a) // a+=b: 20
     
    a -= b 
    console.log("a-=b: "+a) // a-=b: 10
     
    a *= b 
    console.log("a*=b: "+a) // a*=b: 100
     
    a /= b 
    console.log("a/=b: "+a) // a/=b: 10
     
    a %= b 
    console.log("a%=b: "+a) // a%=b: 0
    
  6. 三元/条件运算符
    三元运算有 3 个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。
    Test ? expr1 : expr2

    Test - 指定的条件语句
    expr1 - 如果条件语句 Test 返回 true 则返回该值
    expr2 - 如果条件语句 Test 返回 false 则返回该值

    var num:number = -2 
    var result = num > 0 ? "大于 0" : "小于 0,或等于 0" 
    console.log(result) // 小于 0,或等于 0
    
  7. 字符串运算符:连接运算符 (+)
    运算符可以拼接两个字符串,

    var msg:string = "codebaoku"+".com" 
    console.log(msg) // codebaoku.com
    
  8. 类型运算符

    • typeof 运算符 typeof 是一元运算符,返回操作数的数据类型。
    var num = 12 
    console.log(typeof num);   // number
    
    • instanceof 运算符检查一个对象是否是一个特定的构造函数创建的,或者是否实现了一个特定的接口。它只能用在表达式中,不能用在类型上下文中。它返回一个布尔值,表示对象是否属于构造函数的原型链。例如:
    interface Animal {
        eat(): void;
    }
     
    class Dog implements Animal {
        eat() {
            console.log("Dog eats");
        }
        bark() {
            console.log("Dog barks");
        }
    }
     
    let dog = new Dog();
    console.log(dog instanceof Dog); // true
    console.log(dog instanceof Animal); // true
    

    typeof 和 instanceof 的使用场景也不同:

    • 使用 typeof 来获取或检查简单的内置类型,例如字符串,数字,布尔值等。
    • 使用 instanceof 来检查自定义的类型,例如类,接口等。
    • 使用 instanceof 来检查复杂的内置类型,例如数组,正则表达式等。

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

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

相关文章

C语言第三十六弹---文件操作(中)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 文件操作 1、文件的顺序读写 1.1、顺序读写函数介绍 1.1.1、fgetc 与 fputc 1.1.2、fgets 与 fputs 1.1.3、fscanf 与 fprintf 1.1.4、fread 与 fwrite 1.…

【vue3之组合式API及其新特性】

组合式API及其新特性 一、setup1.写法2.如何访问3.语法糖4.同步返回对象 二、reactive()和ref()1.reactive()2.ref() 三、computed四、watch函数1.侦听单个数据2.侦听多个数据3. immediate4. deep5.精确侦听对象的某个属性 五、生命周期函数六、组件通信1.父传子2. 子传父 七、…

云消息队列 Confluent 版正式上线!

作者&#xff1a;阿里云消息队列 前言 在 2023 年杭州云栖大会上&#xff0c;Confluent 成为阿里云技术合作伙伴&#xff0c;在此基础上&#xff0c;双方展开了深度合作&#xff0c;并在今天&#xff08;3月1日&#xff09;正式上线“云消息队列 Confluent 版”。 通过将 Co…

基于51单片机心率脉搏计设计

目 录 摘 要 I Abstract II 引 言 1 1 控制系统设计 3 1.1 系统方案设计 3 1.2 系统总体设计 4 2 硬件设计 5 2.1 主控电路 5 2.2 驱动电路 8 2.3 信号采集电路 10 2.4 显示电路 13 2.5 总体电路图设计 15 3 软件设计 16 3.1 软件开发环境的介绍 16 3.2 系统重要函数介绍 16 4…

解决QMYSQL driver not loaded问题

前言 之前都是在Qt5.51上开发&#xff0c;连接mysql数据库一直没有问题&#xff0c;换到5.15.2后一直报错 一查才发现\5.15.2\msvc2019_64\plugins\sqldrivers目录下没有qsqlmysql了&#xff0c;5.5.1是有的&#xff0c;5.15.2是要自己编译的。。。 下载源码 安装qt的时候没…

大型多模态智能体:综述

论文链接&#xff1a;https://arxiv.org/abs/2402.15116 大型语言模型&#xff08;LLMs&#xff09;在推动文本基础的智能体方面已经取得了超群的性能&#xff0c;赋予它们类似人类的决策和推理能力。与此同时&#xff0c;一个新兴的研究趋势集中于将这些LLM驱动的智能体扩展到…

这套系统架构,同事直呼666

你使用的每一个热门应用程序的背后,都有一个由架构、测试、监控和安全措施组成的软件系统。今天让我们看一下满足生产环境应用程序的高级架构由哪些体系组成。 CI/CD 管道 我们的第一个关键领域是持续集成和持续部署——CI/CD 管道。 这确保了我们的代码从存储库出发,经过…

【TOP】中科院1区TOP,Elsevier出版社,仅2-3个月录用!

【SciencePub学术】 01 期刊基本信息 【期刊简介】IF&#xff1a;5.0-5.5&#xff0c;JCR1区&#xff0c;中科院1区TOP&#xff1b; 【版面情况】正刊&#xff0c;仅10篇版面&#xff1b; 【检索情况】SCIE在检&#xff0c;预计3个月左右录用&#xff1b; 【征稿领域】有关…

图机器学习(2)-图的基本表示

0 复习 1 图的基本表示 1.1 本体图Ontology 疾病和食物之间的关系&#xff1a;能吃、不能吃、推荐吃。 1.2 图的种类 药物和药物之间的副作用就是异质图&#xff1a; 二分图是一种特殊的异质图&#xff1a; 1.3 节点连接数 通过节点数可以说明节点的重要度。 1.4 邻接…

.NetCore6.0实现ActionFilter过滤器记录接口请求日志

文章目录 目的实现案例&#xff1a;一.首先我们新建一个WebApi项目二.配置 appsettings.json 文件&#xff0c;配置日志存放路径三.创建 Model 文件夹&#xff0c;创建AppConfig类和ErrorLog类1.在AppConfig类中编写一个GetConfigInfo方法获取配置文件中的值2.在ErrorLog类中&a…

Apache Flink连载(三十七):Flink基于Kubernetes部署(7)-Kubernetes 集群搭建-3

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录

重庆有哪些媒体资源?活动展会媒体邀约

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 重庆作为中国的一个直辖市&#xff0c;拥有丰富的媒体资源&#xff0c;涵盖电视台、广播电台、报纸、杂志以及网络媒体等各个领域。这些媒体不仅是传播新闻和信息的重要渠道&#xff0c;…

学习JavaEE的日子 Day23 迭代器,LinkedList,Vector,Stack,HashSet,LinkedHashSet

Day23 1.迭代器 含义&#xff1a;遍历集合中的数据 分类&#xff1a;Iterator 和 ListIterator Iterator 和 ListIterator 区别 Iterator &#xff1a;Collection接口下所有的实现类都可以获取的迭代器&#xff0c;可以在遍历时删除元素 ListIterator &#xff1a;List接口下所…

京东数据分析平台(京东店铺数据分析工具)推荐

京东店铺数据分析能够帮助商家了解自己的经营状况&#xff0c;优化商品策略&#xff0c;提高销售效率。以下是京东店铺数据分析的一些基本步骤和方法&#xff1a; 首先&#xff0c;在进行京东店铺数据分析时&#xff0c;我们需要借助一些电商数据分析工具来获取相关数据&#…

一次一对一服务引起的沉思和笑话(微信号Stefan)

前情提要 客户需求&#xff1a; 分析页面代码和接口请求协议和参数需求&#xff0c;将人工下载视频怎么获得最终的视频链接&#xff0c;这一逻辑清晰的展示并讲解清除。我询问了是否需要成品爬虫&#xff0c;他说代码他自己能搞定。 我给的价格选择&#xff1a; 第一种、首…

基于状态机的按键消抖实现

摸鱼记录 Day_14 !(^O^)y review 在day_13中以按键状态判断为例学习了状态分析基于状态机的按键消抖原理-CSDN博客 分析得到了下图&#xff1a; 今日任务&#xff1a;完成此过程 !(^O^)y 小梅哥对应视频&#xff1a; 15B 基于状态机的按键消抖Verilog实现_哔哩哔哩…

[C#]winform基于C2PNet算法实现室内和室外图像去雾

【CP2Net框架】 https://github.com/YuZheng9/C2PNet 【CP2Net介绍】 Abstract 考虑到不适定的性质&#xff0c;发展了单图像去模糊的对比正则化&#xff0c;引入了来自负图像的信息作为下界。然而&#xff0c;对比样本是非一致的&#xff0c;因为阴性通常距离清晰&#xff…

二维码门楼牌管理系统应用场景:赋能市场研究与城市决策的新动力

文章目录 前言一、市场研究的新视角&#xff1a;门牌数据揭示市场趋势二、城市规划的得力助手&#xff1a;门牌数据指导资源分配三、决策制定的科学依据&#xff1a;门牌数据提升决策准确性四、未来展望&#xff1a;二维码门楼牌管理系统的更多可能性 前言 随着信息技术的飞速…

国创证券|存钱有窍门,掌握这五个窍门利息高出不少?

大部分居民会把手中闲置的资金存入银行&#xff0c;享用安稳的收益&#xff0c;其间存在以下五个诀窍&#xff1a; 1、比照不同银行的利率 储户在去银行存钱时&#xff0c;能够比照不同银行的利率&#xff0c;尽量地挑选利率较高的银行存&#xff0c;来获取较多的收益&#x…

UML类图详解

目录 概述1 什么是UMLUML模型和图形UML2.2中一共定义了14种图示。 2 UML类图作用3 类图格式4类与类之间的关系表达 概述 我们在阅读开源项目时&#xff0c;总是希望能比较高效的整理清楚项目中的各个类之间的关系&#xff0c;那么有没有相应的工具能高效、简洁的表示清楚类关系…