当前位置: 首页 > article >正文

ES6规范新特性总结

ES6新特性

  • var、let和const
    • 不存在变量提升
    • 暂时性死区
    • 不允许重复声明
  • 解构赋值
    • 用途:
      • 交换变量的值
      • 从函数返回多个值
      • 提取JSON数据
      • 遍历map结构
      • 输入模块的制定方法
  • 字符串的扩展
    • codePointAt()
    • String.fromCharCode()
    • at()
    • includes(),startsWith(),endsWith()
    • repeat()
    • padStart(), padEnd()
    • 模版字符串
    • String.raw()
  • 正则的扩展
    • RegExp构造函数
  • 数值的扩展
    • Number()方法
    • Number.isFinite() 和 Number.isNaN()
    • Number.parseInt() 和 Number.parseFloat()
    • Number.isInterger()
    • Number.EPSILON
    • 安全整数和Number.isSafeInteger()
    • Math对象的扩展
      • Math.trunc()
      • Math.sign()
      • Math.cbrt()
      • Math.clz32()
      • Math.imul()
      • Math.fround()
      • Math.hypot()
    • 对数方法
    • 三角函数方法
    • 指数运算符
  • 数组的扩展
    • Array.from()
    • Array.of()
    • 数组实例的copyWithin()
    • 数组实例的find()和findIndex()
    • 数组实例的fill()
    • 数组实例的entries()、keys()、和values()
    • 数组实例的includes()
    • 数组的空位
    • 数组推导

  • 下面是波煮在阅读阮一峰圣经之后总结的一些关于ES6的知识点,希望可以帮助到大家

var、let和const

不存在变量提升

  • var命令会存在变量提升,但是let命令不会变量提升

暂时性死区

  • 本质:只要一进去当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量

不允许重复声明

  • let不允许在相同作用域内,重复声明同一个变量

解构赋值

  • 规则:只要等号右边的值不是对象,就先将其转化为对象,由于undefinednull无法转为对象,所以对它们进行解构赋值都会报错
    函数参数的解构赋值
  • 函数的参数也可以解构赋值
function add([x,y]){return x + y
}add([1,2]) //x=1,y=2

用途:

交换变量的值

[x,y] = [y,x] //交换了x和y的值

从函数返回多个值

  • 函数只能返回一个值,如果要返回多个值,只能将其放在数组或对象中返回。有了解构赋值,取出这些值就非常方便
const example = ()=>{return [1,2,3]
}var [a,b,c] = example()
//a = 1
//b = 2
//c = 3

提取JSON数据

  • 解构赋值对提取JSON对象中的数据尤其有用
  • 可以快速提取JSON数据的值
var jsonData = {id:1,status:"OK",data:[123,321]
}let {id,status,data} = jsonData
//id = 1
//status = "OK"
//data = [123,321]

遍历map结构

  • 任何部署了iterator接口的对象,都可以用for…of循环遍历。Map结构原生支持iterator接口,配合变量的解构赋值,获取键名和键值就非常方便
var map = new Map()
map.set('first','one')
map.set('second','two')for(let [key,value] of map){console.log(key + "is" value)
}
//first is one
//second is two
  • 如果只想获取键名或者键值,可以写成下面这样
//获取键名
for(let [key] of map){}//获取键值
for(let [,value] of map){}

输入模块的制定方法

  • 加载模块时,往往需要指定输入哪些方法。解构赋值是的输入语句非常清晰
const {method1, method2} = require('source-methods')

字符串的扩展

codePointAt()

  • 能够正确处理4个字节储存的字符,返回一个字符的码点
  • 对于2个字节储存的常规字符,它的返回结果与charCodeAt()方法相同
  • codePointAt()方法返回的是码点的十进制值,如果想要十六进制的值,可以使用toString方法转换一下
  • codePointAt()方法实测实一个字符由2个字节还是4个字节组成的最简单的方法
const is32Bit = (c)=>{return c.codePointAt(0) > 0xFFFF
}is32Bit("𠜂")
is32Bit("a")

String.fromCharCode()

  • 可以识别大于0xFFFF的字符

注意:fromCharCode()方法定义在String对象上,而codePointAt()方法定义在字符串的实例对象

at()

  • ES5对字符串对象提供了charAt方法返回字符串给定位置的字符。该方法不能识别码点大于0xFFFF的字符
  • ES7为字符串实例提供了at方法,可以识别Unicode编号大于0xFFFF的字符,返回正确的字符

includes(),startsWith(),endsWith()

  • includes():返回布尔值,表示是否找到了参数字符串
  • startsWith():返回布尔值,表示参数字符串是否在源字符串的头部
  • endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部
var s = "Hello world"
s.startsWith('Hello') //true
s.endsWith('!') //false
s.includes('o') //true

这三个方法都支持第二个参数,表示开始搜索的位置

repeat()

  • repeat方法返回一个新字符串,表示将原字符串重复n次
'x'.repeat(3) //"xxx"
  • 参数如果是小数,会向下取整,即忽略后面的小数部分
'x'.repeat(2.9)
  • 如果参数是负数或者Infinity,会报错
  • 参数NaN等同于0

padStart(), padEnd()

  • ES7推出来字符串补全长度的功能,如果某个字符串未达指定长度,会在头部或者尾部补全。padStart用于头部补全,padEnd用于尾部补全
'x'.padStart(5,'ab') //'ababx'
'x'.padStart(4,'ab') //'abax''x'.padEnd(5,'ab') //'xabab'

模版字符串

  • 模版字符串是增强版的字符串,用反引号标识。
  • 可以都当做普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量

注意:在模版字符串中嵌入变量,需要将变量名写在${}中

String.raw()

  • 是一个特殊的模版字符串标签,用于返回模版字符串的原始内容,而不是处理后的字符串。
  • 他不会对字符串中的转义字符进行解释,而是直接返回他们的原始文本
let rawStr = String.raw`Hello\nWorld`;
console.log(rawStr);// 输出:Hello\nWorldlet str = `Hello\nWorld`;
console.log(str);// 输出:// Hello// World

正则的扩展

RegExp构造函数

  • ES6允许RegExp构造函数接受正则表达式作为参数,这是会返回一个原有正则表达式的拷贝
var regex = new RegExp(/xyz/i)

数值的扩展

  • ES6提供了二进制和八进制数值的新写法,分别用前缀0b 和 0o 表示
0b111110111 === 503 //true
0o767 === 503 //ture
  • 如果要将使用0b和0x前缀的字符串数值转为十进制的值,要使用

Number()方法

Number('0b111') //7
Number('0o10') //8

Number.isFinite() 和 Number.isNaN()

  • ES6在Number对象上新提供了Number.isFinite()Number.isNaN()两个方法,用来检查Infinite和NaN这两个特殊值
  • Number.isFinite():用来检查一个数值是否非无穷
    - Number.isNaN():用来检查一个值是否为NaN

注意:这两个新方法只对数值有效,对于非数值一律返回false

Number.parseInt() 和 Number.parseFloat()

  • ES6将全局方法parseInt()parseFloat()移植到了Number对象上,行为完全保持不变,这样做的目的,是逐步减少全局性方法,使语言逐步模块化
  • 用于将字符串安全地转换为数字

Number.isInterger()

  • 用来判断一个值是否为整数。
  • 注意:在js内部,整数和浮点数是同样的储存方法,所以3和3.0被视为同一个值
Number.isInteger(25) //true
Number.isInteger(25.0) //true
Number.isInteger(25.1) //false
Number.isInteger("15") //false
Number.isInteger(true) //false

Number.EPSILON

  • ES6在Number对象上新增了一个极小的常量------Number.EPSILON
  • 引入这个值的目的:在于为浮点数计算设置一个误差范围。

安全整数和Number.isSafeInteger()

  • ES6引入了Number.MAX_SAFE_INTEGERNumber.MIN_SAFE_INTEGER两个常量,用来表示这个范围的上下限 ------ -2的53次方2的53次方(不含两个端点)
  • Number.isSafeInteger():用来判断一个整数是否落在上述范围内

Math对象的扩展

Math.trunc()

  • Math.trunc方法用于去除一个数的小数部分,返回整数部分
Math.trunc(4.1) //4
Math.trunc(4.9) //4
Math.trunc(-4.1) //-4
Math.trunc(-4.9) //-4
Math.trunc(-0.1234) //-0
  • 对于非数值,Math.trunc()内部使用Number方法将其先转为数值
  • 对于空值和无法截取的整数的值,返回NaN
Math.trunc(NaN) //NaN
Math.trunc('foo') //NaN
Math.trunc() //NaN

Math.sign()

  • Math.sign()方法用于判断一个数到底是正数、负数、还是零
  • 返回值的五种情况:
    • 参数为正数,返回+1
    • 参数为负数,返回-1
    • 参数为0,返回0
    • 参数为-0,返回-0
    • 其他值,返回NaN

Math.cbrt()

  • Math.cbrt()方法用于计算一个数的立方根

Math.clz32()

  • 该方法返回一个数的32位无符号整数形式有多少个前导0

Math.imul()

  • 该方法返回两个数以32位带符号整数形式相乘的结果,返回的也是一个32位的带符号整数
Math.imul(2,4) //8
Math.imul(-1,8) //-8
Math.imul(-2,-2) //4

Math.fround()

  • Math.fround()方法返回一个数的单精度浮点数形式
Math.fround(1) //1
Math.fround(1.337) //1.3370000123977661

Math.hypot()

  • 该方法返回所有参数的平方和的平方根
Math.hypot(3,4) //5
Math.hypot(NaN) //NaN
Math.hypot(3,4,'foo') //NaN
  • 只要有一个参数无法转为数值,就会返回NaN

对数方法

  1. Math.expm1(x):返回e^x-1,即Math.exp(x) - 1
  2. Math.log1p(x):返回log(1+x),如果x小于-1,则返回NaN
  3. Math.log10(x):返回以10为底的x的对数,如果x小于0,则返回NaN
  4. Math.log2(x):返回以2为底的x的对数。如果x小于0,则返回NaN

三角函数方法

  • ES6新增了6个三角函数方法
  1. Math.sinh(x):返回x的双曲正弦
    2. Math.conh(x):返回x的双曲余弦
  2. Math.tanh(x):返回x的双曲正切
  3. Math.asinh(x):返回x的反双曲正弦
  4. Math.acosh(x):返回x的反双曲余弦
  5. Math.atanh(x):返回x的反双曲正切

指数运算符

  • ES7新增了一个指数运算符(**)
2**2 = 4
3**3 = 27//新的赋值运算符
a **= 2
等同于:a = a * a

数组的扩展

Array.from()

  • 该方法用于将两类对象转为真正的数组:
    1. 类似数组的对象:必须有length属性
    2. 可遍历的对象(包括set和map)
let arrayLike = {'0':'a','1':'b','2':'c',length:3
};//ES5的写法
var arr1 = [].slice.call(arrayLike)//ES6的写法
var arr2 = Array.from(arrayLike)

注意:只要是部署了iterator接口的数据结构,Array.from都能将其转为数组

  • 如果参数是一个真正的数组,那么该方法的返回结果是一个一模一样的数组
    - Array.from()还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组
  • 应用:将字符串转为数组,然后返回字符串的长度,因为它能正确处理各种Unicode字符,可以避免JavaScript将大于\uFFFF的Unicode字符算作2个字符的bug

Array.of()

- Array.of()方法用于将一组值转换为数组

Array.of(3,11,8) //[3,11,8]
Array.of(3)  //[3]
Array.of(3).length //1
  • Array.of()基本上可以用来替代Array()或者new Array(),并且不存在由于参数不同而导致的重载。
  • Array.of()总是返回参数值组成的数组。如果没有参数,就返回一个空数组

数组实例的copyWithin()

  • 该方法的作用:在当前数组内部将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。使用这个方法会修改当前数组
[1,2,3,4,5].copyWithin(0,3)
//[4,5,3,4,5]
  • 上述代码的解释:上述代码表示将从3号位置直到数组结束的成员(4和5),复制到从0号位置开始的位置,结果覆盖了原来的1和2

数组实例的find()和findIndex()

  • 数组实例的find()方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员一次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员,如果没有符合条件的成员,则返回undefined
[1,4,-5,10].find(n=>n<0)
//-5
  • 数组实例的findIndex()方法与find()方法非常类似,返回的是第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1

数组实例的fill()

  • fill()方法使用给定值填充数组
  • fill()方法还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置

数组实例的entries()、keys()、和values()

  • 这三个方法都用来遍历数组,返回一个遍历器对象
  • keys()是对键名的遍历
  • values()是对键值的遍历
  • entries()是对键值对的遍历
for(let index of ['a','b'].keys()){console.log(index)
}
// 0
// 1for(let [index,elem] of ['a','b'].entries()){console.log(index,elem)
}
// 0 'a'
// 1 'b'

数组实例的includes()

  • 该方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似
  • 该方法的第二个参数表示搜索的起始位置,默认是0
  • 没有该方法时,通常使用数组的indexOf方法检查是否包含某个值

注意:Map和Set数据结构有一个has方法,需要和includes进行区分

  • Map结构的has方法是用来查找键名的
  • Set结构的has方法是用来查找值的

数组的空位

  • 数组的空位指数组的某一个位置没有任何值
  • 注意:空位不是undefined,一个位置的值等于undefined依然是有值的。空位是没有任何值
  • ES6明确将空位转为undefined

数组推导

  • 允许直接通过现有数组生成新数组
var a1 = [1,2,3,4]
var a2 = [for (i of a1) i * 2]a2 //[2,4,6,8]
  • 上面的代码表示,数组a2通过for…of结构直接在a1的基础上生成
  • 注意,数组推导中,for…of结构总是写在最前面,返回的表达式写在最后面
  • 数组推导可以替代map和filter方法

相关文章:

ES6规范新特性总结

ES6新特性 var、let和const不存在变量提升暂时性死区不允许重复声明 解构赋值用途&#xff1a;交换变量的值从函数返回多个值提取JSON数据遍历map结构输入模块的制定方法 字符串的扩展codePointAt()String.fromCharCode()at()includes(),startsWith(),endsWith()repeat()padSta…...

PyQt学习记录

PyQt学习记录 要在界面上 创建一个控件&#xff0c;就需要在程序代码中 创建 这个 控件对应类 地一个 实例对象。 在Qt系统中&#xff0c;控件&#xff08;widget&#xff09;是 层层嵌套 的&#xff0c;除了最顶层的控件&#xff0c;其他的控件都有父控件。 几个函数 函数mo…...

嵌入式硬件篇---Uart和Zigbee

文章目录 前言一、UART&#xff08;通用异步收发传输器&#xff09;1. 基本概念2. 工作原理帧结构起始位数据位校验位停止位 异步通信波特率 3. 特点优点缺点 4. 典型应用 二、ZigBee1. 基本概念2. 技术细节工作频段2.4GHz868MHz 网络拓扑星型网络网状网络簇状网络 协议栈物理层…...

代码随想录算法训练营--打卡day8

一.反转字符串II 1.题目链接 541. 反转字符串 II - 力扣&#xff08;LeetCode&#xff09; 2.思路 循环分组定位&#xff1a;使用 for 循环&#xff0c;每2k为一组。i 每次增加 2k &#xff0c;就相当于定位到下一组字符的起始位置。在每次循环中&#xff0c;确定当前组需要…...

Linux 学习笔记(5)路径知识详解:绝对路径、相对路径与特殊路径符(期末、期中复习必备)

前言 一、相对路径与绝对路径 1、概念阐述 2、实际示例 二、特殊路径符 1.特殊路径符介绍 2.应用场景 三、总结 四、结语 前言 在 Linux 系统的学习过程中&#xff0c;路径的概念至关重要&#xff0c;它是我们在文件系统中定位文件和目录的关键。今天&#xff0c;我们就…...

Trae + LangGPT 生成结构化 Prompt

Trae LangGPT 生成结构化 Prompt 0. 引言1. 安装 Trae2. 克隆 LangGPT3. Trae 和 LangGPT 联动4. 集成到 Dify 中 0. 引言 Github 上 LangGPT 这个项目&#xff0c;主要向我们介绍了写结构化Prompt的一些方法和示例&#xff0c;我们怎么直接使用这个项目&#xff0c;辅助我们…...

【ida】ida笔记

1 ida下载 IDA Pro 7.0 Windows 和 macOS 版本&#xff0c;包含全部 F5 插件 - 资源分享 - iOS 安全论坛 - 专注于研究 iOS 安全 - iOS Hacker 2 IDA基操 1 shiftF12 查看string信息 (通常可以看到重要的信息 ) 2 Alt T 查找带有目标字符串的函数 3 F5 查看C代码 4 Ctrl F…...

动态规划——两个数组的dp问题

目录 1. 最长公共子序列 2. 不相交的线 3. 不同的子序列 4. 通配符匹配 5. 正则表达式匹配 6. 交错字符串 7. 两个字符串的最小ASCII删除和 8. 最长重复子数组 1. 最长公共子序列 题目链接&#xff1a;1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff0…...

stream流Collectors.toMap(),key值重复问题

文章目录 一、问题二、问题示例三、原因四、解决方法4.1、方案一 一、问题 发现Collectors.toMap的一个坑&#xff0c;若key值重复的时候会抛异常。如&#xff1a; IllegalStateException: Duplicate key 男 二、问题示例 报错示例如下&#xff1a; import lombok.AllArgsC…...

机器学习 Day10 逻辑回归

1.简介 流程就是&#xff1a; 就是我们希望回归后激活函数给出的概率越是1和0. 2.API介绍 sklearn.linear_model.LogisticRegression 是 scikit-learn 库中用于实现逻辑回归算法的类&#xff0c;主要用于二分类或多分类问题。以下是对其重要参数的详细介绍&#xff1a; 2.1.…...

即时通讯软件BeeWorks,企业如何实现细粒度的权限控制?

BeeWorks作为一款专为企业设计的即时通讯平台&#xff0c;高度重视用户隐私安全&#xff0c;采取了多种措施来保障数据的保密性、完整性和可用性。 首先&#xff0c;BeeWorks采用私有化部署模式&#xff0c;企业可以将服务器架设在自己的网络环境中&#xff0c;所有通讯数据&a…...

Seq2Seq - Dataset 类

本节代码定义了一个 CMN 类&#xff0c;它继承自 PyTorch 的 Dataset 类&#xff0c;用于处理英文和中文的平行语料库。这个类的主要作用是将文本数据转换为模型可以处理的格式&#xff0c;并进行必要的填充操作&#xff0c;以确保所有序列的长度一致。 ⭐重写Dataset类是模型训…...

学习OpenCV C++版

OpenCV C 1 数据载入、显示与保存1.1 概念1.2 Mat 类构造与赋值1.3 Mat 类的赋值1.4 Mat 类支持的运算1.5 图像的读取与显示1.6 视频加载与摄像头调用1.7 数据保存 参考&#xff1a;《OpenCV4快速入门》作者冯 振 郭延宁 吕跃勇 1 数据载入、显示与保存 1.1 概念 Mat 类 : Ma…...

echarts图表相关

echarts图表相关 echarts官网折线图实际开发场景一&#xff1a; echarts官网 echarts官网 折线图 实际开发场景一&#xff1a; 只有一条折线&#xff0c;一半实线&#xff0c;一半虚线。 option {tooltip: {trigger: "axis",formatter: (params: any) > {const …...

idea自动部署jar包到服务器Alibaba Cloud Toolkit

安装插件&#xff1a;Alibaba Cloud Toolkit 配置服务器: 服务器配置&#xff1a; 项目启动Shell脚本命令: projectpd-otb.jar echo 根据项目名称查询对应的pid pid$(pgrep -f $project); echo $pid echo 杀掉对应的进程&#xff0c;如果pid不存在&#xff0c;则不执行 if [ …...

奥利司他

https://m.baidu.com/bh/m/detail/ar_9900965142893895938 奥利司他&#xff08;四氢脂抑素&#xff09;是一种众所周知的胰腺和胃脂肪酶不可逆抑制剂 生物活性&#xff1a;奥利司他&#xff08;四氢脂抑素&#xff09;是一种众所周知的胰腺和胃脂肪酶不可逆抑制剂。奥利司…...

Element Plus 图标使用方式整理

Element Plus 图标使用方式整理 以下是 Element Plus 图标的所有使用方式&#xff0c;包含完整代码示例和总结表格&#xff1a; 1. 按需引入图标组件 适用场景&#xff1a;仅需少量图标时&#xff0c;按需导入减少打包体积 示例代码&#xff1a; <template><div>…...

链路聚合+vrrp

1.链路聚合 作用注意事项将多个物理接口&#xff08;线路&#xff09;逻辑上绑定在一起形成一条逻辑链路&#xff0c;起到叠加带宽的作用1.聚合接口必须转发速率一致。2.聚合设备两端必须一致 配置命令 方法一 [Huawei]interface Eth-Trunk 0----先创建聚合接口&#xff0c;…...

Dynamics 365 Business Central Register Customer Payment 客户付款登记

#Dynamics 365 BC ERP# #D365 ERP# #Navision 前言 在实施过程&#xff0c;经常给客户介绍的 给客户付款一般用Payment Journal. 在客户熟悉系统运行后&#xff0c;往往会推荐客户使用Register Customer Payment.用这个function 工作会快很多&#xff0c;但出错的机会也比较大…...

Odoo免费开源ERP:企业销售过程中出现的问题

在企业未上线Odoo免费开源ERP时&#xff0c;企业销售过程中会存在失误。比如&#xff0c;许多销售订单都有如下问题&#xff1a;不当的定价、向客户过多地询问、处理订单延误、错过发货日期等。这些问题源于企业三个未集成的信息系统&#xff1a;销售管理系统、库存系统和财务系…...

手撕unique_ptr 和 shareed_ptr

文章目录 unique_ptrshared_ptr unique_ptr template<class T> class Unique_ptr { private:T* ptrNULL; public://1、删除默认的拷贝构造函数Unique_ptr(Unique_ptr& u) delete;//2、删除默认的复制构造Unique_ptr& operator(Unique_ptr& u) delete; …...

工会考试的重点内容是什么

工会考试的内容通常涵盖以下几个方面&#xff1a; 1、政治理论&#xff1a; 主要考查考生对马克思主义基本原理、中国特色社会主义理论体系、党的基本路线、方针、政策等方面的掌握程度。题型通常包括选择题、判断题和论述题。 2、法律法规&#xff1a; 这部分主要涉及国家…...

网络稳定性--LCA+最大生成树+bfs1/dfs1找最小边

1.最大生成树去除重边&#xff0c;只要最大的边成树 2.LCA查最近公共祖先&#xff0c;然后询问的lca(x,y)ff,分别从x,y向上找最小边 3.bfs1/dfs1就是2.中向上找的具体实现 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typede…...

混合并行技术在医疗AI领域的应用分析(代码版)

混合并行技术(专家并行/张量并行/数据并行)通过多维度的计算资源分配策略,显著提升了医疗AI大模型的训练效率与推理性能。以下结合技术原理与医疗场景实践,从策略分解、技术对比、编排优化及典型案例等维度展开分析: 一、混合并行技术:突破单卡算力限制 1. 并行策略三维分…...

【C++面向对象】封装(上):探寻构造函数的幽微之境

每文一诗 &#x1f4aa;&#x1f3fc; 我本将心向明月&#xff0c;奈何明月照沟渠 —— 元/高明《琵琶记》 译文&#xff1a;我本是以真诚的心来对待你&#xff0c;就像明月一样纯洁无瑕&#xff1b;然而&#xff0c;你却像沟渠里的污水一样&#xff0c;对这份心意无动于衷&a…...

每日算法-250409

这是我今天的算法学习记录。 2187. 完成旅途的最少时间 题目描述 思路 二分查找 解题过程 为什么可以使用二分查找&#xff1f; 问题的关键在于寻找一个最小的时间 t&#xff0c;使得在时间 t 内所有公交车完成的总旅途次数 sum 大于等于 totalTrips。 我们可以观察到时间的单…...

如何实现文本回复Ai ChatGPT DeepSeek 式文字渐显效果?前端技术详解(附完整代码)

个人开发的塔罗牌占卜小程序&#xff1a;【问问塔罗牌】 快来瞧瞧吧&#xff01; 一、核心实现原理 我们通过三步实现这个效果&#xff1a; 逐字渲染&#xff1a;通过 JavaScript 定时添加字符 透明度动画&#xff1a;CSS 实现淡入效果 光标动画&#xff1a;伪元素 CSS 动画…...

CompletableFuture高级模式详解

目录 CompletableFuture高级模式详解 1. CompletableFuture基础概念 1.1 什么是CompletableFuture? 1.2 异步编程基础 1.3 CompletableFuture与Future的对比 2. 创建CompletableFuture 2.1 基本创建方法 2.2 使用异步方法创建 2.3 指定执行器 3. 转换和链式操作 3.…...

【AI开源大模型工具链ModelEngine】【01】应用框架-源码编译运行

ModelEngine提供从数据处理、知识生成&#xff0c;到模型微调和部署&#xff0c;以及RAG&#xff08;Retrieval Augmented Generation&#xff09;应用开发的AI训推全流程工具链。 GitCode开源地址&#xff1a;https://gitcode.com/ModelEngineGitee开源地址&#xff1a;https…...

linux下截图工具的选择

方案一 gnome插件Screenshot Tool&#xff08;截屏&#xff09; ksnip&#xff08;图片标注&#xff09; gnome setting设置图片的默认打开方式为ksnip就可以快捷的将Screenshot Tool截屏的图片打开进行标记了。 但是最近我发现Screenshot Tool的延迟截图功能是有问题的&…...