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

一、枚举类型

使用枚举我们可以定义一些带名字的常量。 使用枚举可以清晰地表达意图或创建一组有区别的用例。 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 来检查复杂的内置类型,例如数组,正则表达式等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式:软件开发的秘密武器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Python基础快速入门

Python基础快速入门 前置知识 Python Python是一种广泛使用的高级编程语言&#xff0c;以其易于学习和使用的语法而闻名。以下是Python的一些主要特点&#xff1a; 高级语言&#xff1a;Python是一种高级语言&#xff0c;这意味着它提供了较高层次的抽象&#xff0c;使编程更…

Hack The Box-Crafty

目录 信息收集 rustscan whatweb WEB 漏洞利用 漏洞说明 漏洞验证 提权 get user.txt get Administrator 总结 信息收集 rustscan ┌──(root㉿ru)-[~/kali/hackthebox] └─# rustscan -a 10.10.11.249 --range0-65535 --ulimit5000 -- -A -sC [~] Automatically…

【好书推荐-第十一期】《Java面试八股文:高频面试题与求职攻略一本通(视频解说版)》(博文视点出品)

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号&#xff1a;洲与AI。 &#x1f388; 本文专栏&#xff1a;本文收录…

【Linux进阶之路】网络 —— “?“ (下)

文章目录 前言一、概念铺垫1.TCP2.全双工 二、网络版本计算器1. 原理简要2. 实现框架&&代码2.1 封装socket2.2 客户端与服务端2.3 封装与解包2.4 请求与响应2.5 对数据进行处理2.6 主程序逻辑 3.Json的简单使用 总结尾序 前言 在上文我们学习使用套接字的相关接口进行了…

数据结构入门(3)2.链表接口实现

目录 前言 头文件 动态申请一个结点 单链表打印 单链表尾插 单链表的头插 单链表的尾删 单链表头删 单链表查找 单链表在pos位置之后插入x 单链表删除pos位置之后的值 在pos的前面插入 删除pos位置 销毁顺序表 前言 本文将介绍链表常见的功能的实现 头文件 #…

【深度学习】Lora

论文标题&#xff1a;LoRA: Low-Rank Adaptation of Large Language Models 论文链接&#xff1a;https://arxiv.org/abs/2106.09685 论文来源&#xff1a;NVIDIA 1.提出背景 自然语言处理的一个重要范式为使用领域数据对模型进行大规模的预训练 &#xff0c;并适应特定的任务或…

LLM PreTraining from scratch -- 大模型从头开始预训练指北

最近做了一些大模型训练相关的训练相关的技术储备,在内部平台上完成了多机多卡的llm 预训练的尝试,具体的过程大致如下: 数据准备: 大语言模型的训练依赖于与之匹配的语料数据,在开源社区有一群人在自发的整理高质量的语料数据,可以通过 以下的一些链接获取 liwu/MNBVC…

全面认识计算机操作系统(二)

目录 一、操作系统的诞生 相关概念&#xff1a; 1. 手工操作阶段 2. 脱机输入 / 输出阶段 &#xff08;1&#xff09;脱机输入技术 &#xff08;2&#xff09;脱机输出技术 3. 单道批处理阶段 4. 多道批处理阶段 5. 分时技术产生 6. 实时系统产生 二、现代操作系统的…

就业班 2401--3.11 Linux Day15--ftp数据传输测试server和client+谷歌验证码登录远程连接

文件服务器 路漫漫其修远兮&#xff0c;吾将上下而求索.构建NFS远程共享存储 一、NFS介绍 文件系统级别共享&#xff08;是NAS存储&#xff09; --------- 已经做好了格式化&#xff0c;可以直接用。 速度慢比如&#xff1a;nfs&#xff0c;sambaNFS NFS&#xff1a;Networ…

vue3项目安装unplugin-auto-import插件实现按需导入API

1、安装unplugin-auto-import npm i -D unplugin-auto-import2.vite.config.ts文件进行配置 import { defineConfig } from vite import vue from vitejs/plugin-vue import AutoImport from unplugin-auto-import/vite// https://vitejs.dev/config/ export default defineCo…

低代码平台如何选型 盘点国内外主流低代码开发平台

随着数字化转型的加速&#xff0c;低代码开发平台作为一种新型软件开发方式&#xff0c;受到了广泛关注。国内低代码市场也呈现出蓬勃发展的态势&#xff0c;各种低代码平台如雨后春笋般涌现。本文将对国内低代码平台进行盘点&#xff0c;以帮助企业和开发者更好地了解市场情况…

亚马逊多账号怎么防关联?超级浏览器来帮你!

很多做亚马逊跨境电商的小伙伴都会遇到的问题就是多登店铺账号被关联&#xff0c;我们要知道&#xff0c;如果在亚马逊上运营多个店铺&#xff0c;保持账户之间的独立性是很重要的。一旦账户之间被平台识别为关联&#xff0c;不仅可能导致收入损失&#xff0c;还可能面临账号被…

鸿蒙开发(四)-低代码开发

鸿蒙开发(四)-低代码开发 本文主要介绍下鸿蒙下的低代码开发。 鸿蒙低代码是指在鸿蒙操作系统进行应用开发时&#xff0c;采用简化开发流程和减少编码量的方式来提高开发效率。 1&#xff1a;开启低代码开发 首先我们打开DevEco Studio .然后创建工程。 如图所示&#xff…

Java网络编程详解

目录 网络编程 1、概述 2、网络通信的要素 3、IP 4、端口 5、通信协议 6、TCP 文件上传 Tomcat 7、UDP 单方发送单方接受 双方发送接收 8、URL URL测试 URL下载网络资源 网络编程 1、概述 信件&#xff1a; 计算机网络&#xff1a; 计算机网络是指将地理位置不…

微服务配置中心

什么是配置中心 配置中心是一种用于管理应用程序或系统配置信息的中央服务。它允许开发人员在多个环境&#xff08;如开发、测试、生产&#xff09;之间共享配置&#xff0c;并且可以在不停止应用程序的情况下动态更新配置。 配置中心是统一管理各种应用配置的工具。它能够集中…

导出谷歌浏览器收藏的网页,并查看网页保存的登录密码

导出谷歌浏览器&#xff08;Chrome&#xff09;收藏的网页&#xff08;书签&#xff09;&#xff1a; 打开谷歌浏览器。在浏览器右上角找到并点击三个垂直排列的小点&#xff08;或称汉堡菜单&#xff09;以打开主菜单。在下拉菜单中选择“书签” > “书签管理器”。在书签…

R语言扩展包与MaxEnt模型的集成:实现高效的物种分布模拟

在生态学研究中&#xff0c;物种分布模拟是一项至关重要的任务。它有助于我们理解物种与环境之间的复杂关系&#xff0c;预测物种在气候变化或人类活动影响下的潜在分布变化。近年来&#xff0c;随着计算机技术的不断发展&#xff0c;基于机器学习的物种分布模拟方法逐渐成为研…

Day35:安全开发-JavaEE应用原生反序列化重写方法链条分析触发类类加载

目录 Java-原生使用-序列化&反序列化 Java-安全问题-重写方法&触发方法 Java-安全问题-可控其他类重写方法 思维导图 Java知识点&#xff1a; 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&…

Oracle 层级查询(Hierarchical Queries)

如果一张表中的数据存在分级&#xff08;即数据间存在父子关系&#xff09;&#xff0c;利用普通SQL语句显示数据间的层级关系非常复杂&#xff0c;可能需要多次连接才能完整的展示出完成的层级关系&#xff0c;更困难的是你可能不知道数据到底有多少层。而利用Oracle的层级查询…