ES6 新特性,优势和用法?
ES6 新特性,优势和用法?
ES6(ECMAScript 2015)引入了许多新特性,这些特性让 JavaScript 变得更加强大、简洁和易于使用。下面为你详细介绍一些常见的 ES6 新特性、它们的优势以及用法。
1. 块级作用域:let 和 const
特性介绍
在 ES6 之前,JavaScript 只有全局作用域和函数作用域,使用 var 声明变量时可能会导致变量提升和作用域混乱的问题。let 和 const 用于声明块级作用域的变量,let 声明的变量可以重新赋值,而 const 声明的常量一旦赋值就不能再重新赋值(对于引用类型,虽然不能重新赋值,但可以修改其内部属性)。
优势
- 避免变量提升带来的问题,使代码逻辑更加清晰。
- 防止变量在不期望的作用域内被修改。
代码示例
// 使用 var 声明变量,存在变量提升问题
function varExample() {if (true) {var x = 10;}console.log(x); // 输出 10,因为 var 声明的变量会提升到函数作用域顶部
}
varExample();// 使用 let 声明变量,具有块级作用域
function letExample() {if (true) {let y = 20;}// console.log(y); // 报错,y 只在 if 块级作用域内有效
}
letExample();// 使用 const 声明常量
function constExample() {const PI = 3.14;// PI = 3.1415; // 报错,常量不能重新赋值const obj = { name: 'John' };obj.name = 'Jane'; // 可以修改引用类型的内部属性console.log(obj.name); // 输出 Jane
}
constExample();
2. 箭头函数
特性介绍
箭头函数是 ES6 中引入的一种简洁的函数定义方式,它使用箭头 => 来定义函数。箭头函数没有自己的 this、arguments、super 或 new.target,它的 this 值继承自外层函数。
优势
- 语法简洁,减少代码量。
- 解决了
this指向问题,避免了使用that = this或.bind(this)等方式。
代码示例
// 传统函数定义
function add(a, b) {return a + b;
}
console.log(add(3, 5)); // 输出 8// 箭头函数定义
const addArrow = (a, b) => a + b;
console.log(addArrow(3, 5)); // 输出 8// 箭头函数的 this 指向问题
const person = {name: 'John',sayHello: function() {// 传统函数的 this 指向 person 对象console.log(`Hello, my name is ${this.name}`);setTimeout(function() {// 这里的 this 指向全局对象(在浏览器中是 window)console.log(`After 1 second, my name is ${this.name}`);}, 1000);},sayHelloArrow: function() {console.log(`Hello, my name is ${this.name}`);setTimeout(() => {// 箭头函数的 this 继承自外层函数,即 person 对象console.log(`After 1 second, my name is ${this.name}`);}, 1000);}
};
person.sayHello();
person.sayHelloArrow();
3. 模板字符串
特性介绍
模板字符串使用反引号()来定义字符串,可以在字符串中嵌入表达式,使用 ${}` 语法。
优势
- 字符串拼接更加简洁直观,避免了使用
+号进行拼接的繁琐。 - 可以保留换行和缩进,使代码更易读。
代码示例
const name = 'John';
const age = 30;// 传统字符串拼接
const message1 = 'My name is ' + name + ' and I am ' + age + ' years old.';
console.log(message1);// 使用模板字符串
const message2 = `My name is ${name} and I am ${age} years old.`;
console.log(message2);// 保留换行和缩进
const multiLineMessage = `This is a multi-line message.It can have multiple linesand preserve indentation.
`;
console.log(multiLineMessage);
4. 解构赋值
特性介绍
解构赋值允许你从数组或对象中提取值,并赋值给变量。
优势
- 代码更加简洁,避免了手动访问数组元素或对象属性的繁琐。
- 可以方便地交换变量的值。
代码示例
// 数组解构赋值
const numbers = [1, 2, 3];
const [a, b, c] = numbers;
console.log(a); // 输出 1
console.log(b); // 输出 2
console.log(c); // 输出 3// 交换变量的值
let x = 10;
let y = 20;
[x, y] = [y, x];
console.log(x); // 输出 20
console.log(y); // 输出 10// 对象解构赋值
const personObj = { firstName: 'John', lastName: 'Doe', age: 30 };
const { firstName, lastName, age } = personObj;
console.log(firstName); // 输出 John
console.log(lastName); // 输出 Doe
console.log(age); // 输出 30// 重命名变量
const { firstName: givenName, lastName: familyName } = personObj;
console.log(givenName); // 输出 John
console.log(familyName); // 输出 Doe
5. 类和继承
特性介绍
ES6 引入了 class 关键字,用于定义类,以及 extends 关键字,用于实现类的继承。类是一种面向对象的编程概念,使 JavaScript 更符合传统的面向对象语言的风格。
优势
- 代码结构更加清晰,提高了代码的可维护性和可扩展性。
- 使 JavaScript 更易于理解和使用面向对象的编程范式。
代码示例
// 定义一个类
class Animal {constructor(name) {this.name = name;}speak() {console.log(`${this.name} makes a sound.`);}
}// 定义一个子类,继承自 Animal 类
class Dog extends Animal {constructor(name) {super(name); // 调用父类的构造函数}speak() {console.log(`${this.name} barks.`);}
}const animal = new Animal('Generic Animal');
animal.speak(); // 输出 Generic Animal makes a sound.const dog = new Dog('Buddy');
dog.speak(); // 输出 Buddy barks.
6. Promise 对象
特性介绍
Promise 是一种处理异步操作的对象,它有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。可以使用 then 方法处理成功的结果,使用 catch 方法处理失败的结果。
优势
- 解决了回调地狱问题,使异步代码更加清晰和易于维护。
- 提供了统一的异步操作处理方式。
代码示例
// 创建一个 Promise 对象
const promise = new Promise((resolve, reject) => {setTimeout(() => {const success = true;if (success) {resolve('Operation succeeded');} else {reject('Operation failed');}}, 1000);
});// 处理 Promise 的结果
promise.then((result) => {console.log(result); // 输出 Operation succeeded}).catch((error) => {console.error(error);});
7. 模块化:import 和 export
特性介绍
ES6 引入了模块化的概念,使用 export 关键字导出模块中的变量、函数或类,使用 import 关键字导入其他模块中的内容。
优势
- 提高了代码的可维护性和可复用性,将代码拆分成多个模块,每个模块负责单一的功能。
- 避免了全局命名冲突。
代码示例
模块文件 math.js
// 导出变量
export const PI = 3.14;// 导出函数
export function add(a, b) {return a + b;
}// 导出类
export class Calculator {constructor() {}multiply(a, b) {return a * b;}
}
主文件 main.js
// 导入模块中的内容
import { PI, add, Calculator } from './math.js';console.log(PI); // 输出 3.14
console.log(add(3, 5)); // 输出 8const calculator = new Calculator();
console.log(calculator.multiply(3, 5)); // 输出 15
以上这些 ES6 新特性让 JavaScript 编程更加高效、简洁和强大,在现代 JavaScript 开发中被广泛使用。
如何在项目中使用ES6的新特性?
前端项目使用 ES6 新特性
简单网页直接使用
如果你只是做一个简单的网页,不涉及复杂的项目构建,就可以直接在 HTML 文件里用 ES6 新特性。不过要注意,有些老版本的浏览器可能不支持这些新特性哦。
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>ES6 简单使用</title>
</head><body><!-- 这里用 type="module" 告诉浏览器这是个 ES6 模块 --><script type="module">// 用箭头函数定义一个简单的函数,它用来拼接问候语const sayHello = (name) => `你好,${name}!`;// 调用这个函数,把结果打印到控制台console.log(sayHello('张三'));// 定义一个对象,包含姓名和年龄const person = {name: '李四',age: 25};// 用解构赋值把对象里的属性取出来,赋值给同名变量const { name, age } = person;// 把取出的属性信息打印到控制台console.log(`${name} 今年 ${age} 岁了。`);</script>
</body></html>
使用构建工具(Webpack + Babel)
对于大型的前端项目,为了让代码能在各种浏览器正常运行,还能优化代码,我们通常会用构建工具。这里以 Webpack 和 Babel 为例。
步骤 1:创建项目并初始化
先创建一个新的文件夹当作项目目录,然后在这个目录下打开命令行工具,运行 npm init -y 命令,它会快速帮你生成一个 package.json 文件,这个文件记录着项目的各种信息和依赖。
步骤 2:安装必要的依赖
在命令行里运行下面的命令,安装 Webpack、Webpack 命令行工具、Babel 加载器、Babel 核心和 Babel 预设环境。
npm install webpack webpack-cli babel-loader @babel/core @babel/preset-env --save-dev
步骤 3:配置 Babel
在项目根目录下创建一个 .babelrc 文件,把下面的内容复制进去:
{// 告诉 Babel 用 @babel/preset-env 这个预设来转换代码"presets": ["@babel/preset-env"]
}
步骤 4:配置 Webpack
在项目根目录下创建一个 webpack.config.js 文件,内容如下:
const path = require('path');module.exports = {// 项目的入口文件,Webpack 从这里开始打包entry: './src/index.js',output: {// 打包后文件的输出目录path: path.resolve(__dirname, 'dist'),// 打包后文件的名称filename: 'bundle.js'},module: {rules: [{// 匹配所有以 .js 结尾的文件test: /\.js$/,// 排除 node_modules 目录下的文件exclude: /node_modules/,use: {// 使用 babel-loader 来处理 .js 文件loader: 'babel-loader'}}]}
};
步骤 5:编写 ES6 代码
在项目里创建一个 src 文件夹,在里面创建 index.js 文件,用 ES6 特性写代码:
// 定义一个类,代表动物
class Animal {// 构造函数,用来初始化对象的属性constructor(name) {this.name = name;}// 定义一个方法,让动物发出声音speak() {console.log(`${this.name} 发出了声音。`);}
}// 创建一个 Animal 类的实例
const dog = new Animal('小狗');
// 调用实例的 speak 方法
dog.speak();
步骤 6:打包项目
在 package.json 文件里添加一个打包脚本,像这样:
{"scripts": {"build": "webpack"}
}
然后在命令行里运行 npm run build 命令,Webpack 就会把 src 目录下的代码打包成 dist 目录下的 bundle.js 文件。
步骤 7:在 HTML 里引入打包后的文件
在 dist 目录下创建一个 index.html 文件,把打包后的 bundle.js 文件引入进去:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Webpack 打包后的页面</title>
</head><body><!-- 引入打包后的 JavaScript 文件 --><script src="bundle.js"></script>
</body></html>
Node.js 项目使用 ES6 新特性
Node.js 高版本直接支持 ES6 模块
从 Node.js 13.2.0 版本开始,Node.js 原生支持 ES6 模块了。有两种方式可以用:
方式一:用 .mjs 文件扩展名
把文件扩展名改成 .mjs,就能直接在文件里用 ES6 模块语法啦。
// math.mjs
// 导出一个函数,用来做加法
export const add = (a, b) => a + b;// main.mjs
// 从 math.mjs 文件里导入 add 函数
import { add } from './math.mjs';
// 调用 add 函数,把结果打印到控制台
console.log(add(3, 5));
然后在命令行里运行 node main.mjs 命令。
方式二:在 package.json 里设置 type: "module"
在 package.json 文件里加上 "type": "module",这样 .js 文件也能使用 ES6 模块语法了。
{"name": "node-es6-project","version": "1.0.0","type": "module","scripts": {"start": "node main.js"}
}
// math.js
// 导出一个函数,用来做乘法
export const multiply = (a, b) => a * b;// main.js
// 从 math.js 文件里导入 multiply 函数
import { multiply } from './math.js';
// 调用 multiply 函数,把结果打印到控制台
console.log(multiply(3, 5));
接着在命令行里运行 npm start 命令。
用 Babel 转换代码(兼容旧版本 Node.js)
要是你得兼容旧版本的 Node.js,就可以用 Babel 来转换代码。
步骤 1:创建项目并初始化
同样先创建项目目录,在目录下运行 npm init -y 命令初始化 package.json 文件。
步骤 2:安装依赖
在命令行里运行下面的命令,安装 Babel 相关的依赖:
npm install @babel/core @babel/cli @babel/preset-env --save-dev
步骤 3:配置 Babel
在项目根目录下创建 .babelrc 文件,内容和前面前端项目里的一样:
{"presets": ["@babel/preset-env"]
}
步骤 4:编写 ES6 代码
在 src 目录下创建 index.js 文件,用 ES6 特性写代码:
// 定义一个异步函数,模拟获取数据
async function fetchData() {// 返回一个 Promise 对象,1 秒后返回数据return new Promise((resolve) => {setTimeout(() => {resolve('数据获取成功');}, 1000);});
}// 立即执行的异步函数
(async () => {// 等待 fetchData 函数执行完,把结果赋值给 data 变量const data = await fetchData();// 把获取到的数据打印到控制台console.log(data);
})();
步骤 5:转换代码
在 package.json 文件里添加转换脚本:
{"scripts": {"build": "babel src --out-dir dist"}
}
然后在命令行里运行 npm run build 命令,Babel 会把 src 目录下的代码转换后放到 dist 目录里。
步骤 6:运行转换后的代码
在命令行里运行 node dist/index.js 命令,就能看到转换后的代码正常运行啦。
在 Node.js 项目中,如何使用 ES6 的新特性?
在 Node.js 项目里使用 ES6(ES2015)新特性可以让代码更简洁、高效且易于维护。下面从几个方面详细介绍如何在 Node.js 项目中使用 ES6 新特性。
1. 开启 ES6 支持
Node.js 默认支持大部分 ES6 特性,但在早期版本里,对于一些特性可能需要额外配置。现在 Node.js 较新的版本(如 v14 及以上)已经很好地支持了 ES6 特性。不过,如果要使用 ES6 的模块系统(import 和 export),需要做些额外设置。
使用 .mjs 文件扩展名
把文件扩展名改为 .mjs,Node.js 会自动将其视为 ES6 模块。
// 示例文件:math.mjs
// 定义一个函数,用于计算两个数的和
export function add(a, b) {return a + b;
}// 示例文件:main.mjs
// 从 math.mjs 模块中导入 add 函数
import { add } from './math.mjs';// 调用 add 函数
const result = add(3, 5);
console.log(result);
在命令行中运行 node main.mjs,就能看到输出结果。
在 package.json 中配置
在 package.json 文件里添加 "type": "module",这样 .js 文件也能使用 ES6 模块语法。
{"name": "my-node-project","type": "module","version": "1.0.0"
}
然后就可以在 .js 文件里使用 import 和 export 了。
2. 常用 ES6 特性示例
箭头函数
箭头函数是 ES6 中简洁定义函数的方式,它没有自己的 this、arguments、super 或 new.target,适合用于简单的回调函数。
// 传统函数定义
function square(x) {return x * x;
}// 箭头函数定义
const squareArrow = (x) => x * x;console.log(square(4));
console.log(squareArrow(4));
模板字符串
模板字符串可以让字符串拼接更方便,支持换行和嵌入表达式。
const name = '张三';
const age = 25;// 传统字符串拼接
const message1 = '你好,我叫' + name + ',今年' + age + '岁。';// 模板字符串拼接
const message2 = `你好,我叫 ${name},今年 ${age} 岁。`;console.log(message1);
console.log(message2);
解构赋值
解构赋值可以方便地从数组或对象中提取值并赋给变量。
// 数组解构
const numbers = [1, 2, 3];
const [a, b, c] = numbers;
console.log(a);
console.log(b);
console.log(c); // 对象解构
const person = {firstName: '李四',lastName: '王五',age: 30
};
const { firstName, lastName, age } = person;
console.log(firstName);
console.log(lastName);
console.log(age);
let 和 const
let 和 const 是 ES6 中用于声明变量的关键字,let 有块级作用域,const 用于声明常量,一旦赋值就不能再重新赋值。
// let 示例
function testLet() {if (true) {let x = 10;console.log(x); }// 这里访问不到 x,因为 x 有块级作用域// console.log(x);
}
testLet();// const 示例
const PI = 3.14159;
// 下面这行代码会报错,因为 PI 是常量,不能重新赋值
// PI = 3.14;
类和继承
ES6 引入了 class 关键字,让 JavaScript 有了更像传统面向对象语言的类和继承机制。
// 定义一个基类
class Animal {constructor(name) {this.name = name;}speak() {console.log(`${this.name} 发出声音`);}
}// 定义一个子类,继承自 Animal 类
class Dog extends Animal {speak() {console.log(`${this.name} 汪汪叫`);}
}const myDog = new Dog('旺财');
myDog.speak();
通过这些方法,你可以在 Node.js 项目中充分利用 ES6 的新特性,提升开发效率和代码质量。
相关文章:
ES6 新特性,优势和用法?
ES6 新特性,优势和用法? ES6(ECMAScript 2015)引入了许多新特性,这些特性让 JavaScript 变得更加强大、简洁和易于使用。下面为你详细介绍一些常见的 ES6 新特性、它们的优势以及用法。 1. 块级作用域:le…...
简说spring 的设计模式
spring 的设计模式(23种…) (面试题)说说BeanFactory和FactoryBean的实现原理和区别? spring 中你还知道哪些设计模式?? 1.简单工厂模式 实质: 由一个工厂类根据传入的参数,动态决…...
【 Avalonia UI 语言国际化 I18n】图文结合教学,保姆级教学,语言国际化就是这么简单(.Net C#)
完整项目地址 github : https://github.com/Crazy-GrowUp/AvaloniaI18nTest/tree/master gitee :https://gitee.com/jack_of_disco/avalonia-i18n-test 0.项目新建 Properties 文件夹 对应的项目配置文件里面就会增加 <Folder Include"Properties\" /> 1.项…...
Spring Boot 日志管理(官网文档解读)
摘要 本篇文章详细介绍了SpringBoot 日志管理相关的内容,文章主要参考官网文章的描述内容,并在其基础上进行一定的总结和拓展,以方便学习Spring Boot 的小伙伴能快速掌握Spring Boot 日志管理相关的内容。 日志实现方式 Sping Boot 的日志管…...
Nginx学习笔记:常用命令端口占用报错解决Nginx核心配置文件解读
Nginx 1. 基础命令1.1 重新加载systemd配置1.2 停止Nginx服务1.3 启动Nginx服务1.4 重启Nginx服务1.5 查看Nginx服务状态1.6 测试配置和重载Nginx 2. 额外命令2.1 启用开机自启2.2 禁用开机自启2.3 强制关闭所有Nginx进程 3. Nginx端口占用解决方案3.1 查找占用端口8090的进程3…...
【玩转 Postman 接口测试与开发2_020】(完结篇)DIY 实战:随书示例 API 项目本地部署保姆级搭建教程(含完整调试过程)
《API Testing and Development with Postman》最新第二版封面 文章目录 最新版《Postman 接口测试与开发实战》示例 API 项目本地部署保姆级搭建教程1 前言2 准备工作3 具体部署3.1 将项目 Fork 到自己名下3.2 创建虚拟环境并安装依赖3.3 初始运行与项目调试 4 示例项目的用法…...
高清下载油管视频到本地
下载工具并安装: yt-dlp官网地址: GitHub - yt-dlp/yt-dlp: A feature-rich command-line audio/video downloader ffmpeg官网地址: Download FFmpeg 注:记住为其添加环境变量 操作命令: 该指令表示以720p码率下载VIDEO_UR…...
网络运维学习笔记 021 HCIA-Datacom新增知识点02 SDN与NFV概述
SDN与NFV概述 经典IP网络是一个分布式的、对等控制的网络。 每台网络设备存在独立的数据平面、控制平面和管理平面。 设备的控制平面对等的交互路由协议,然后独立的生成数据平面指导报文转发。 它的优势在于设备与协议解耦,厂家间的兼容性较好且故障场景…...
《论模型驱动架构设计方法及其应用》审题技巧 - 系统架构设计师
软件测试工程师软考论文写作框架 一、考点概述 “模型驱动架构设计及其应用”这一论题,主要考察了考生对模型驱动架构设计(MDA)这一先进软件设计方法的理解与应用能力。论题涵盖了MDA的基本概念、核心要素、实施流程及在实际项目中的应用等…...
【Linux】多线程 -> 线程同步与基于BlockingQueue的生产者消费者模型
线程同步 条件变量 当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。 例如:一个线程访问队列时,发现队列为空,它只能等待,直到其它线程将一个节点添加到队列中。这…...
Docker Mysql 数据迁移
查看启动命令目录映射 查看容器名称 docker ps查看容器的启动命令 docker inspect mysql8.0 |grep CreateCommand -A 20如下图所示:我这边是把/var/lib/mysql 目录映射到我宿主机的/mnt/mysql/data目录下,而且我的数量比较大使用方法1的话时间比较久,所以我采用方法2 如果没…...
四步彻底卸载IDEA!!!
各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连,小编尽全力做到更好 欢迎您分享给更多人哦 大家好,我们今天来学习四步彻底卸载IDEA!!! 首先我要提醒各位 如果你想删除 IDEA 相关…...
HTTP实验(ENSP模拟器实现)
HTTP概述 HTTP(HyperText Transfer Protocol,超文本传输协议),设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。 HTTP定义了多种请求方法,常用的包括: GET:请求资源。 POST&…...
【网络安全】常见的web攻击
1、SQL注入攻击 定义: 攻击者在HTTP请求中注入恶意的SQL代码,当服务器利用参数构建SQL语句的时候,恶意的SQL代码被一起构建,并在数据库中执行。 示例: 用户登录: 输入用户名xx, 密码 or 1 …...
登录-05.JWT令牌-介绍
一.JWT令牌 JWT令牌是一种简洁的、自包含的格式,用于在通讯双方之间以json数据格式安全的传输数据。说白了,JWT令牌就是将json格式的数据进行封装,从而实现安全传输。 所谓简洁,就是指JWT令牌就是一个简单的字符串。 所谓自包含…...
K8S下redis哨兵集群使用secret隐藏configmap内明文密码方案详解
#作者:朱雷 文章目录 一、背景环境及方案说明1.1、环境说明1.2、方案一:使用配置文件设置密码1.3、方案二:使用args 的命令行传参设置密码 二、redis secret configmap deployment参考2.1 创建secret-redis.yaml参考2.2 修改configmap配置参…...
Spring框架基本使用(Maven详解)
前言: 当我们创建项目的时候,第一步少不了搭建环境的相关准备工作。 那么如果想让我们的项目做起来方便快捷,应该引入更多的管理工具,帮我们管理。 Maven的出现帮我们大大解决了管理的难题!! Maven…...
spring boot知识点4
1.如何监视所有spring boot微服务 安装actuator插件,然后通过接口查询 /actuator/health 2.spring boot项目性能如何优化 a.优化启动时间,去除重复的依赖 b.JVM优化(java虚拟机优化),限制堆的最小最大值 c.数据库…...
简识Spring创建Bean方式和设计模式
一、理论解释: Spring在创建Bean时主要有四种方式,这些方式分别涉及到了不同的设计模式。以下是具体的创建方式及对应的设计模式: 通过反射调用构造方法创建Bean: 方式:在Spring的配置文件中,使用<bean…...
归并排序 Listnode* vector<int> vector<ListNode*>
加粗样式 ListNode* merge(ListNode* l1,ListNode* l2){ListNode* dummyheadnew ListNode(0);ListNode* curdummyhead;while(l1&&l2){if(l1->val>l2->val){cur->nextl2;l2l2->next;curcur->next;}else if(l1->val<l2->val){cur->nextl1…...
深度解析:大模型在多显卡服务器下的通信机制与分布式训练——以DeepSeek、Ollama和vLLM为例
一、引言:大模型与多显卡的必然结合 随着大模型参数规模突破千亿级(如GPT-4、DeepSeek),单显卡的显存容量与算力已无法满足需求。多显卡并行计算成为训练与推理的核心技术,其核心挑战在于高效通信与负载均衡。本文以国…...
鸿蒙NEXT应用App测试-专项测试(DevEco Testing)
注意:大家记得先学通用测试在学专项测试 鸿蒙NEXT应用App测试-通用测试-CSDN博客 注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注…...
达梦数据库学习笔记@1
目录 达梦数据库学习笔记一、表空间管理(一)默认表空间(二)相关数据字典(三)表空间操作(四)临时表空间管理 二、重做日志管理(一)系统视图(二&…...
设计模式| 观察者模式 Observer Pattern详解
目录 一、概述1.1 动机1.2 核心思想1.3 别名 二、角色与实现原理2.1 角色2.2 实现原理2.3 类图 三、经典接口实现3.1 示例3.1.1 观察者接口3.1.2 目标接口3.1.3 具体被观察者3.1.4 具体观察者3.1.5 Client3.1.6 UML时序图 3.2 特点 四、其他实现方式4.1 委托与事件(…...
时间转换(acwing)c/c++/java/python
读取一个整数值,它是工厂中某个事件的持续时间(以秒为单位),请你将其转换为小时:分钟:秒来表示。 输入格式 输入一个整数 NN。 输出格式 输出转换后的时间表示,格式为 hours:minutes:second…...
Rocky8 源码安装 HAProxy
HAProxy 是一款开源的高性能 负载均衡器 和 反向代理 软件,专注于处理高并发流量分发,广泛应用于企业级架构中提升服务的可用性、扩展性和安全性。 一、HAProxy 简介 1.1.HAProxy 是什么? 本质: 基于 C 语言开发 的轻量级工具&a…...
通过AI辅助生成PPT (by quqi99)
作者:张华 发表于:2025-02-23 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明(http://blog.csdn.net/quqi99) 问题 媳妇需要将一个pdf文件中的某些部分做成PPT课件,我在想是…...
【从0做项目】Java文档搜索引擎(9)烧脑终章!
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 文章导读 零:项目结果展示 一:导入 二:问题引入 1:情…...
什么是 Cloud Studio DeepSeek ; 怎么实现Open WebUI快速体验
什么是 Cloud Studio DeepSeek ;怎么实现Open WebUI快速体验 一、概述 欢迎使用 Cloud Studio DeepSeek 工作空间!我们已为您预装并启动了以下服务,等待加载十几秒即可查看效果: Ollama 服务:支持通过 API 调用 DeepSeek 模型。 AnythingLLM 前端服务:提供交互式聊天界…...
rtconfig.cpython-313.pyc 在 .gitignore文件中写入 *.pyc 文件仍然没有被忽略?
在 .gitignore 文件中添加 *.pyc 和 *.*.pyc 规则时,如果 .pyc 文件仍然没有被忽略,可能有以下几种原因: 1. 已经被 Git 跟踪的文件 即使您在 .gitignore 中指定了忽略 .pyc 文件,Git 仍然会跟踪已经被提交到版本库中的文件。如…...
