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

ECMAScript6 简介及拓展

ECMAScript简介

JavaScript是大家所了解的语言名称, 但它的正式名称叫做ECMAScript

1996年11月, JavaScript的创造者网景公司将JavaScript提交给国际化组织 ECMA(欧洲计算机制造联合会), 希望这种语言能够成为国际标准。

随后 ECMA 发布了规定浏览器脚本语言的标准, 即ECMAScript。 它的历史版本:

version时间描述
1.01997诞生,制定了语言的基本语法
2.01998较小改动,同步独立的ISO国际标准
3.01999引入正则,异常处理,格式化输出等。在业界得到了广泛的支持, 奠定了JS的基本语法
4.02000过于激进,未发布
5.02009引入严格模式,Json,扩展对象,数组,原型,字符串,日期方法
6.02015模块,面向对象语法,Promise,箭头函数,let,const,数组解构赋值等
7.02016幂运算符,数组扩展,Async/await关键字
8.02017Async/await,字符串扩展
9.02018对象解构赋值,正则扩展
102019扩展对象,数组方法

ES6

目前市面上推荐使用的是ECMAScript 6.0(ES6), 主要原因在于:

  • 兼容性 目前并非所有的浏览器相关都支持最新语言的特性,而ES6已经被广泛支持。并且通过转译工具可将ES6转换为较低版本的JavaScript,以确保在各种环境中的运行
  • 新特性 ES6引入了箭头函数,解构赋值,类等,使得代码更加简洁、易读和维护
  • 模块化支持 可以提升代码的复用性和可维护性,使得项目结构更清晰
  • 异步编程 引入Promiseasync特性, 支持异步编程

ES6的推广主要还是为了解决ES5的不足,目前浏览器的JavaScript虽是ES5版本,但大多数的高版本浏览器支持ES6的使用。

它又被称为ES2015, 因为它是2015年发布的,根据年份来命名的。

ES6所支持的新特性简要说明下:

  • 增加letconst, 可用于块作用域声明变量,避免了var变量提升和作用域不明的问题
  • 新增的原始数据类型Symbol, 可用于定义对象的唯一属性
  • 增加了解构赋值的语法, 使得代码更加简洁和易于理解
  • 拓展了Number,支持二/八进制表示,增加了isFinite,整合了parseInt方法等
  • 拓展了String,新增了子字符串的识别, 模版字符串的拼接等
  • 拓展了Array, 增加了对象转换为数组,以及查找的方法相关
  • 拓展了函数的默认参数设置, 箭头函数等
  • 新增Map容器和Set对象的使用
  • 新增ProxyReflect
  • 引入class类的支持, 支持extends继承, super访问父类防范, 静态方法等
  • 引入模块, 主要分为export导出import导入
  • 引入Generator 、Promiseasync等异步编程

let、const和Symbol

ES6之前只有全局变量函数内局部变量letconst为新增关键字:

  • let 必须在声明之后才能使用, 不可重复声明, 块作用域, 变量不能提升
  • const 声明之后必须初始化,否则会报错。 且声明后不允许改变,属于只读变量。
// ---------- let -------------
{let value = 0;console.log(value);     // 0
}
// Error: value is not defined 
console.log(value);// ---------- let -------------
const value: number = 10;
// Error: Assignment to constant variable
value = 100;

经常会拿varlet比较:

/*
var是ES5及之前的JavaScript的关键字,特点:
* 函数作用域,声明的变量在整个函数体内, 而不仅是在块作用域内
* 变量会提升,声明的变量会提升到函数的顶部, 即可在声明之前使用
* 允许重复声明
*/
function example() {var x = 10;if (true) {var x = 20; // 在同一函数作用域内重复声明变量xconsole.log(x); // 输出:20}console.log(x); // 输出:20
}
example();/*
let是ES6及之后的JavaScript和TypeScript引入的关键子,特点:
* 块作用域, 比如if语句,循环语句,并不是整个函数体内
* 不存在变量提升,必须声明之后才能使用
* 不允许重复声明,否则会报错
*/
function example2() {let y = 10;if (true) {let y = 20; // 在块级作用域内声明变量yconsole.log(y); // 输出:20}console.log(y); // 输出:10
}
example2();

const需要注意,所谓的不允许改变真正指的是:变量或引用所指向的内存地址不可改变

在基础数据类型使用中,值就保存在变量指向的地址。 而对于类似于Array数组,Object对象等这些复杂类型, 对象内的子元素是可改变的

// ------------ 数组 ------------
const numData = [1, 2];
// 允许插入数值
numData.push(3);
console.log(numData);
// 不允许改变对象,Assignment to constant variable
numData = [4, 5];// ------------ object ------------
const objectData = {value: 1,
}
// 允许修改对象内部元素
objectData.value = 2;
// 不允许改变对象,Assignment to constant variable
objectData = {value: 2};

Symbol

除了number string boolean, object, null, undefined外, Symbol为新增的原始数据类型。

它被用于表示独一无二的值,可被用于定义对象的唯一属性名,构成:

// lib.es2015.symbol.d.ts
interface SymbolConstructor {readonly prototype: Symbol;// 创建symbol对象(description?: string | number): symbol;// 全局搜索指定key字符串的symbol对象for(key: string): symbol;// 获取symbol对象的key, 如果没有则undefinedkeyFor(sym: symbol): string | undefined;
}declare var Symbol: SymbolConstructor;

基本使用:

let sym = Symbol("a_1");
console.log(typeof(sym), sym);  // "symbol",  Symbol(a_1)

主要用法:

  • 定义常量,保证不同常量的唯一性
  • 作为对象的属性名, 使用[]来设定,不要使用.

简单的实例:

let sy = Symbol("key1");let obj = {[sy]: "kk",value: 10,
};
// 虽然作为对象的属性名,但其实是不可读的, 结果是:{"value": 10}
console.log(obj); 

解构赋值

它是对赋值运算符的扩展, 可用于 **数组 **或 对象 进行模式匹配, 然后对其中的变量进行赋值。

// 基本使用
let [a, b, c] = [1,2,3];
console.log(a, b, c);       // 1,  2,  3 
let {a, b, c} = {a:1,b:2,c:3};
console.log(a, b, c);       // 1,  2,  3 // 嵌套使用
let [a, [b, c]] = [1, [2, 3]];
console.log(a, b, c);  // 1,  2,  3 
let [A, [[B], C]] = [1, [[2], 3]];
console.log(A, B, C);  // 1,  2,  3 // 忽略
let [a1, , c1] = [1, 2, 3];
console.log(a1, c1);    //  1,  3 
let [, b2, , d2] = [1,2, 3,4];
console.log(b2, d2);    // 2,  4 
let [a3, [, b3], [,,c3]] = [1, [2,3], [4,5,6]];
console.log(a3, b3, c3);    // 1,  3,  6 

支持不完全解构,可以做个简单了解,但不推荐使用,会有报错

// Error: Tuple type '[number]' of length '1' has no element at index '1'
let [a1, b1] = [1];
console.log(a1, b1);    // 1,  undefined let [a2 = 1, b2] = [];
console.log(a2, b2);    // 1,  undefined 

支持剩余参数,通过...参数来设定,它会用于收集剩余的元素来创建一个新的数组。

// 数组
let [a, ...b] = [1, 2, 3];
console.log(typeof(a), typeof(b));  // "number",  "object" 
console.log(a, b);                  // 1,  [2, 3] // 对象
let {age, ...params} = {name: "ES", age: 2023, value: 1,
}
// 参数age被赋值,其余的都给了params
// 2023,  {"name": "ES", "value": 1} 
console.log(age, params);   // 函数参数,比如求和
function AddNum(...numbers: any) {let totalValue = 0;for (let num of numbers) {totalValue += parseInt(num);}return totalValue;
}
console.log(AddNum(1, 2, 3));       // 6
console.log(AddNum(1, "2", "3"));   // 6

数字的拓展

  • 二进制和八进制,分别增加了前缀0b/0B0o/0O
console.log(0b1010 === 10); // true
console.log(0o12 === 10); // true
  • Number.EPSILON 的使用, 浮点数的存储和精度问题导致计算机无法精确计算,所以会设置一个很小的误差范围来比对
// 直接比较, 是不相等的
console.log(0.1 + 0.2 === 0.3);     // false // 通过Number.EPSILON比对
function isEqual(a:number, b:number) {return Math.abs(a - b) < Number.EPSILON;
}
console.log(isEqual(0.1+0.2, 0.3));         // true
console.log(isEqual(0.1+0.2, 0.300001));    // false 
  • 增加了最大/最小安全整数, 范围在(2^-53, 2^53)之间
// 最小整数范围下限
const MIN_SAFE = Number.MIN_SAFE_INTEGER;
console.log(MIN_SAFE - 1 === MIN_SAFE - 2);     // true
console.log(MIN_SAFE !== MIN_SAFE + 1);         // true // 最大整数范围上限
const MAX_SAFE = Number.MAX_SAFE_INTEGER;
console.log(MAX_SAFE + 1 === MAX_SAFE + 2);     // true 
console.log(MAX_SAFE !== MIN_SAFE - 1);         // true 
  • Number.isFinite() 检查数值是否为有限数字,即不为Infinity
// 基础数字,true 
console.log(Number.isFinite(1));         
// 最小浮点数误差,true               
console.log(Number.isFinite(Number.EPSILON)); 
// 最小值,true 
console.log(Number.isFinite(Number.MIN_VALUE));
// 最大安全整数上限,true 
console.log(Number.isFinite(Number.MAX_SAFE_INTEGER));// 正无穷大,false
console.log(Number.isFinite(Number.POSITIVE_INFINITY));
// NaN, false 
console.log(Number.isFinite(Number.NaN));
// 注意不存在隐式类型转换,都是false
console.log(Number.isFinite("10"));
console.log(Number.isFinite(undefined));
console.log(Number.isFinite([]));
console.log(Number.isFinite({}));
  • parseInt() 从全局整合到Number中, 它主要用于将字符串转换为指定进制的数字
/*
@funcName: parseInt(string: string, radix?: number | undefined): number
@param: string 转换的字符串
@param: radix: 可选参数进制,范围在[2, 36], 默认十进制
*/
console.log(Number.parseInt("2"));          // 2
console.log(Number.parseInt("12,56"));      // 12
console.log(Number.parseInt("0011",2));     // 3// 注意:虽然整合了,但本质还是一个同一个函数
console.log(parseInt === Number.parseInt);  // true // 注意:无法解析为数字的,会返回NaN
console.log(Number.parseInt("10" + 1));     // 101
console.log(Number.parseInt("abc" + 1));    // NaN // 拓展:可使用 isInteger 检测是否为number, 参数为unknown类型
console.log(Number.isInteger(1));       // true 
// 如下一律为false
console.log(Number.isInteger("1"));     
console.log(Number.isInteger(undefined));
console.log(Number.isInteger(NaN));
console.log(Number.isInteger(false));
console.log(Number.isInteger(null));
console.log(Number.isInteger(Infinity));
console.log(Number.isInteger(Number.NEGATIVE_INFINITY));
  • parseFloat() 从全局整合到Number中, 它用于将字符串转换为数字
/** 
@funcName: parseFloat(string: string): number
@param: string 要转换的字符串
*/// 注意参数不能为非string, 否则报错
// console.log(Number.parseFloat([]));
// console.log(Number.parseFloat(undefined));console.log(Number.parseFloat('123.45'));   // 123.45 
console.log(Number.parseFloat('123.45abc'));// 123.45 
console.log(Number.parseFloat('123abc456'));// 123// 解析不出来就是NaN
console.log(Number.parseFloat('abc'));      // NaN
  • Math对象增加了一些方法的支持
方法名描述
clz32返回数字的32 位无符号整数形式的前导0的个数
imul返回两个数的32位整数乘积
sign返回一个数的符号,是正数(1)、负数(-1)还是0
log10返回一个数的以10为底的对数
log2返回一个数的以2为底的对数
log1p返回一个数加1的自然对数
expm1返回一个数的自然指数减1
cosh返回一个数的双曲余弦值
sinh返回一个数的双曲正弦值
tanh返回一个数的双曲正切值
acosh返回一个数的反双曲余弦值
asinh返回一个数的反双曲正弦值
atanh返回一个数的反双曲正切值
hypot返回所有参数的平方和的平方根
trunc返回一个数的整数部分
fround返回一个数的最接近的单精度浮点数表示
cbrt返回一个数的立方根//
// imul 计算 a * b 
console.log(Math.imul(2, 3)); // 6                
// sign 判定数字符号,为是正数(1)、负数(-1)还是零
console.log(Math.sign(0));                       // 0
console.log(Math.sign(Number.MAX_VALUE));        // 1
console.log(Math.sign(Number.NEGATIVE_INFINITY));// -1
// hypot 计算 所有参数的平方和的平方根
console.log(Math.hypot(3));     // 3
console.log(Math.hypot(3, 4));  // 5
// trunc 返回数字的整数部分,没有四舍五入
console.log(Math.trunc(0.56));  // 0
console.log(Math.trunc(-1.56)); // -1
// cbrt 返回数字的立方根
console.log(Math.cbrt(8));      // 2
// log10 返回以10为底的对数
console.log(Math.log10(100));   // 2

其他内容可参考: TypeScript 之 Number


字符串的拓展

增加的新特性主要有:

  • 模版字符串的支持, 支持使用反引号和${}对字符串进行组合
// 使用反引号支持多行
let content = `Hello:
You have a lot of names, ES6 and ES2015
`
console.log(content);// 组合,且支持表达式的计算
const strName = 'Alice';
const ageNum = 25;
const msg = `My name ${strName} and I am ${ageNum+1} years old.`;
// "My name Alice and I am 26 years old."
console.log(msg);// 表达式
const x = 10;
const y = 5;
const result = `${x} + ${y} = ${x + y}`;
// "10 + 5 = 15"
console.log(result);// 调用函数
function f(){return "have fun!";
}
let content = `Game start,${f()}`;
// "Game start,have fun!" 
console.log(content);
  • 增加了字符串检索子字符串的接口:
const str = 'Hello, world!';
// startsWith 检测字符串是否在原字符串串头部
console.log(str.startsWith('Hello'));   // true
console.log(str.startsWith('ello'));    // false 
// endsWith 检测字符串是否在原字符串的尾部
console.log(str.endsWith('world!'));    // true
console.log(str.endsWith('rld'));       // false
// includes 检测是否包含字符串
console.log(str.includes('llo'));       // true
console.log(str.includes('o, w'));      // true 
  • 增加了重复字符串和填充字符串的接口:
let str = 'a';/**
reqeat 返回指定次数的新字符串,注意:
* 如果参数为大于0的浮点数,则向下取整
* 如果为0到-1之间的数字,默认为0
*/
console.log(str.repeat(3));     // "aaa"
console.log(str.repeat(3.5));   // "aaa"
console.log(str.repeat(-0.1));  // "" /*
@padStart(maxLength: number, fillString?: string): string
@func: 从头部补充字符串
@param: 设定的长度,如果小于当前字符串长度,则返回当前字符串
@param: 填充的字符串
*/
str = str.repeat(3);
// 长度小于当前字符串长度,不变
console.log(str.padStart(1, 'x')); // "aaa" 
console.log(str.padStart(5, 'x')); // "xxaaa"// padEnd 从末尾补充字符串
console.log(str.padEnd(6, 'y'));  // "aaayyy" 

其他内容可参考: TypeScript 之 String


数组的拓展

  • 扩展元算符的拓展..., 支持将独立的元素合并为一个新的数组等
// 方式1
let [a, ...b] = [1, 2, 3];
console.log(typeof(a), typeof(b));  // "number",  "object" 
console.log(a, b);                  // 1,  [2, 3] // 方式2
const arr1 = [1, 2];
const arr2 = [4, 5];
const mergedArray = [...arr1, ...arr2];
console.log(mergedArray); // [1, 2, 4, 5]// 方式3
function AddNum(...numbers: any) {let totalValue = 0;for (let num of numbers) {totalValue += parseInt(num);}return totalValue;
}
console.log(AddNum(1, 2, 3));       // 6
  • Array.of() 将参数转换为数组
console.log(Array.of(1, 2, 3));      // [1, 2, 3] 
console.log(Array.of(1, '2', true)); // [1, "2", true] 
  • Array.from() 将对象或可迭代器对象转换为数组
// 基本使用
const str = 'hello';
const arr = Array.from(str);
console.log(arr);       // ["h", "e", "l", "l", "o"]// 支持对每个元素处理
let array = Array.from([1, 2, 3], (n) => n * 2)
console.log(array);     // [2, 4, 6] 
  • find()findIndex() 查找满足条件的元素相关
const numbers = [1, 2, 3];// find 查找并返回满足条件的第一个元素
const evenNumber = numbers.find(num => num % 2 === 0);
console.log(evenNumber); // 2// findIndex 查找并返回满足条件的第一个元素索引
const index = numbers.findIndex(num => num % 2 === 0);
console.log(index);  // 1 
  • includes() 检测数组中是否包含指定元素
const fruits = ['apple', 'banana', 'orange'];
console.log(fruits.includes('banana')); // true
console.log(fruits.includes('grape'));  // false
  • fill() 填充数据
/**
@func: fill用指定的数值填充数组,会修改原有数组,并返回新的数组
@param: 填充的数值
@param: 开始索引, 如果忽略表示开始
@param: 结束索引, 如果忽略表示末尾
*/
let arr1 = Array.of(1, 2, 3);
console.log(arr1.fill(0));      // [0, 0, 0]let arr2 = Array.of(1, 2, 3);
console.log(arr2.fill(0,1,2)); // [1, 0, 3]
  • flat() 将嵌套数组展平为一个新的数组
const arr = [1, 2, [3], [4]];
const flattenedArray = arr.flat();
console.log(flattenedArray); // [1, 2, 3, 4]

其他内容可参考: TypeScript 之 Array

相关文章:

ECMAScript6 简介及拓展

ECMAScript简介 JavaScript是大家所了解的语言名称&#xff0c; 但它的正式名称叫做ECMAScript。 1996年11月&#xff0c; JavaScript的创造者网景公司将JavaScript提交给国际化组织 ECMA(欧洲计算机制造联合会)&#xff0c; 希望这种语言能够成为国际标准。 随后 ECMA 发布…...

可视化构建包分析报告

一、webpack 使用 webpack-bundle-analyzer 插件即可。 安装&#xff1a;npm install webpack-bundle-analyzer -D 使用&#xff1a;new BundleAnalyzerPlugin(options?: object) Name Type Description analyzerMode One of: server, static, json, disabled Default: se…...

统一git使用方法,git状态变迁图,git commit提交规范

目录 说明 统一git使用方法 git状态变迁图 git commit 提交规范 说明 多次工作中多名员工不懂git多次技术分享&#xff0c;自行查资料学习git并使用&#xff0c;会出现使用各种偏僻的命令&#xff0c;异常问题无法解决&#xff1b;或出现带url的git合并提交。主要是学的不…...

react与vue的区别

React和Vue.js是两个流行的JavaScript库/框架&#xff0c;用于构建用户界面。以下是React和Vue之间的一些主要区别&#xff1a; 学习曲线&#xff1a;Vue.js对于新手来说比React更容易学习和上手。 构建方式&#xff1a;React强调组件的可重用性&#xff0c;而Vue.js更注重模板…...

成功解决SQL 错误 [22000]: 第3 行附近出现错误: 试图修改自增列[ID](达梦数据库)

当我们使用工具来手动修改自增列的自增ID时&#xff0c;可能会报如下异常 SQL 错误 [22000]: 第3 行附近出现错误:试图修改自增列[ID] 解决办法&#xff1a; 可以使用SQL语句来修改 ALTER TABLE "fdw"."SYSTEM_DICT_TYPE" DROP IDENTITY; UPDATE "f…...

【算法】活用双指针完成复写零操作

Problem: 1089. 复写零 文章目录 题目解析算法原理分析找到最后一个复写的位置从后往前进行复写操作 代码展示 题目解析 首先我们来分析一下本题的题目意思 可以看到题目中给到了一个数组&#xff0c;意思是让我们将数组中的零元素都复写一遍&#xff0c;然后将其余的元素向后平…...

【面试高频题】难度 3/5,字典树热门运用题

题目描述 这是 LeetCode 上的 「745. 前缀和后缀搜索」 &#xff0c;难度为 「困难」。 Tag : 「字典树」 设计一个包含一些单词的特殊词典&#xff0c;并能够通过前缀和后缀来检索单词。 实现 WordFilter 类&#xff1a; WordFilter(string[] words) 使用词典中的单词 words 初…...

vue base64图片转file流 下载到本地 或者上传

<img :src"data:image/png;base64,form.img" style"max-width:280px;max-height: 280px;margin: auto;" />// base64 转file const base64ToFile()>{let byImg atob(form.img); // 解码base64let n byImg.lengthlet a new Uint8Array(n);while…...

无涯教程-PHP - 简介

PHP 7是最期待的&#xff0c;它是PHP编程语言的主要功能版本。 PHP 7于2015年12月3日发布。本教程将以简单直观的方式教您PHP 7的新功能及其用法。 无涯教程假设您已经了解旧版本的PHP&#xff0c;现在就可以开始学习PHP 7的新功能。 使用下面的示例- <html><head&…...

web基础+HTTP协议+httpd详细配置

目目录录 一、Web基础1.1 HTML概述1.1.1 HTML的文件结构1.1.2 HTML中的部分基本标签 1.3 MIME1.4 URI 和 URL1.4 定义1.4.2 URI 和 URL 的区别 二、静态资源和动态资源2.1 静态资源2.2 动态资源 三、HTTP协议3.1 HTTP协议简介3.2 HTTP协议版本3.2 HTTP方法3.3 HTTP请求访问的完…...

【sql】MongoDB的增删改查分页条件等

【sql】MongoDB的增删改查分页条件等 //增 //新增数据2种方式 db.msg.save({"name":"springboot&#x1f600;"}); db.msg.insert({"name":"mango good"}); db.msg.save({"name":"springboot",type:"工具书&…...

我的动态归纳(便于搜索)

linux dns配置文件是“/etc/resolv.conf”&#xff0c;该配置文件用于配置DNS客户&#xff0c;它包含了主机的域名搜索顺序和DNS/服务器的地址&#xff0c;每一行包括一个关键字和一个或多个空格隔开的参数。 /etc/resolv.conf &#xff08;不配置就不能域名解析&#xff09; 可…...

langchain ChatGPT AI私有知识库

企业知识库 原理就是把文档变为向量数据库&#xff0c;然后搜索向量数据库&#xff0c;把相似的数据和问题作为prompt&#xff0c; 输入到大模型&#xff0c;再利用GPT强大的自然语言处理、推理和分析等方面的能力将答案返回给用户 什么是langchain? langchain是一个强大的…...

API接口常用数据格式Json,Json的定义和XML的区别

现在程序员还有谁不知道 JSON 吗&#xff1f;无论对于前端还是后端&#xff0c;JSON 都是一种常见的数据格式。那么 JSON 到底是什么呢&#xff1f; JSON 的定义 JSON &#xff08;JavaScript Object Notation&#xff09; &#xff0c;是一种轻量级的数据交换格式。它的使用…...

密码学学习笔记(二十一):SHA-256与HMAC、NMAC、KMAC

SHA-256 SHA-2是广泛应用的哈希函数&#xff0c;并且有不同的版本&#xff0c;这篇博客主要介绍SHA-256。 SHA-256算法满足了哈希函数的三个安全属性&#xff1a; 抗第一原像性 - 无法根据哈希函数的输出恢复其对应的输入。抗第二原像性 - 给定一个输入和它的哈希值&#xf…...

操作系统-笔记-第四章-文件管理

目录 四、第四章——文件管理 1、文件管理——基础概念 &#xff08;1&#xff09;文件结构 &#xff08;2&#xff09;操作系统提供的接口 &#xff08;3&#xff09;总结 2、文件的逻辑结构 &#xff08;1&#xff09;有结构文件&#xff08;类似SQL表文件&#xff09…...

【MiniGUI】文字颜色实现透明度变化

在MiniGUi中&#xff0c;输出文字时有时候希望文字带有透明度信息&#xff0c; 即文字能够透出下面的图像来。 很自然地想到&#xff0c;设置颜色时&#xff0c;将颜色设置为带有透明度的颜色&#xff1a; SelectFont(hdc, mg_font);SetTextColor(hdc, RGBA2Pixel(HDC_SCREEN, …...

css中元素加定位之后到一定距离元素会变小

css中元素加定位之后到一定距离元素会变小 主要原因&#xff1a;元素没有加宽高 .swiperWrapper .active{bottom: 380px;left: 215px;z-index: 10; } .swiperWrapper .next{bottom: 170px;left: 7%;z-index: 20; } .swiperWrapper .prev{bottom: 360px;left: 0%;z-index: 30;…...

Java 语言实现冒泡排序

Java 语言实现冒泡排序 介绍 冒泡排序是一种简单直观的排序算法&#xff0c;它重复地比较相邻的两个元素&#xff0c;如果顺序错误就交换它们&#xff0c;直到没有需要交换的元素为止。冒泡排序的思路是通过每一轮的比较将最大&#xff08;或最小&#xff09;的元素逐渐“冒泡…...

面向对象单选题

下列选项中不属于面向对象的特征的是&#xff08;B&#xff09; A、封装性 B、安全性 C、继承性 D、多态性 在Java中,关于继承&#xff0c;类只支持&#xff08;A&#xff09; A、单继承 B、多继承 C、两个都可以 D、两个都不可以 用于定义成员的访问控制权的一组关键字…...

微服务-Fegin

在之前我们两服务之间调用的时候用的是restTemplate,但是这个方式调用存在很多的问题 String url "http://userservice/user/" order.getUserId(); 代码可读性差&#xff0c;编码体验不统一参数复杂的url难以维护 所以我们大力推出我们今天的主角--Fegin Feign是…...

[oneAPI] 使用字符级 RNN 生成名称

[oneAPI] 使用字符级 RNN 生成名称 oneAPI特殊写法使用字符级 RNN 生成名称Intel Optimization for PyTorch数据下载加载数据并对数据进行处理创建网络训练过程准备训练训练网络 结果 参考资料 比赛&#xff1a;https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517…...

【ROS】参数服务器--理论模型与参数操作(C++)

一、概念介绍 参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器&#xff0c;可以将数据存储在该容器中&#xff0c;被不同的节点调用&#xff0c;当然不同的节点也可以往其中存储数据。 作用&#xff1a;存储一些多节点…...

[oneAPI] 基于BERT预训练模型的英文文本蕴含任务

[oneAPI] 基于BERT预训练模型的英文文本蕴含任务 Intel DevCloud for oneAPI 和 Intel Optimization for PyTorch基于BERT预训练模型的英文文本蕴含任务语料介绍数据集构建 模型训练 结果参考资料 比赛&#xff1a;https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0…...

【洛谷】P1163 银行贷款

原题链接&#xff1a;https://www.luogu.com.cn/problem/P1163 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 这题需要注意的是利率按月累计这句话&#xff0c;也就是相当于“利滚利”。 我们定义sum变量表示贷款原值&#xff0c;money表示每月支付…...

Java版工程行业管理系统源码-专业的工程管理软件-提供一站式服务 em

​ 鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工…...

kafka--技术文档--基本docker中安装<单机>-linux

安装zookeeper 阿丹小科普&#xff1a; Kafka在0.11.0.0版本之后不再依赖Zookeeper&#xff0c;而是使用基于Raft协议的Kafka自身的仲裁机制来替代Zookeeper。具体来说&#xff0c;Kafka 2.8.0版本是第一个不需要Zookeeper就可以运行Kafka的版本&#xff0c;这被称为Kafka Raf…...

回归预测 | MATLAB实现WOA-RF鲸鱼优化算法优化随机森林算法多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现WOA-RF鲸鱼优化算法优化随机森林算法多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现WOA-RF鲸鱼优化算法优化随机森林算法多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览…...

Linux系统安全——NAT(SNAT、DNAT)

目录 NAT SNAT SNAT实际操作 DNAT DNAT实际操作 NAT NAT: network address translation&#xff0c;支持PREROUTING&#xff0c;INPUT&#xff0c;OUTPUT&#xff0c;POSTROUTING四个链 请求报文&#xff1a;修改源/目标IP&#xff0c; 响应报文&#xff1a;修改源/目标…...

uniapp项目添加人脸识别功能,可用作登录,付款,流程审批前的安全校验

本案例使用了hbuilder插件商城中的活体检验插件&#xff0c;可自行前往作者处下载查看&#xff0c; 效果图如下 此插件需要在manifest.json中勾选 实现流程 1&#xff1a;前往hbuilder插件市场下载插件 2&#xff1a;在页面中导入import face from "/uni_modules/mcc-…...

SpringBoot面试题

Spring Boot的启动流程主要分为以下几个步骤&#xff1a; 加载Spring Boot配置文件&#xff0c;初始化Spring Boot环境和核心组件&#xff0c;如ApplicationContext上下文环境、自动装配机制等。 执行SpringApplication.run()方法&#xff0c;执行所有Spring Boot自动配置的Be…...

Git相关命令

SSH密钥文件 Github里面S设置SH公钥有两者选择方式 账号下的每个仓库都设置一个公钥&#xff0c;因为GitHub官方要求每个仓库的公钥都不能相同&#xff0c;所以每个账号都要搞一个密钥&#xff08;很麻烦&#xff09;给账号分配一个公钥&#xff0c;然后这个公钥就可以在这个…...

《HeadFirst设计模式(第二版)》第八章代码——模板方法模式

代码文件目录&#xff1a; CaffeineBeverage package Chapter8_TemplateMethodPattern;/*** Author 竹心* Date 2023/8/17**/public abstract class CaffeineBeverage {final void prepareRecipe(){boilWater();brew();pourInCup();//这里使用钩子customerWantsCondiments()来…...

RESTful API,以及如何使用它构建 web 应用程序

RESTful API是一种基于HTTP协议的API设计风格&#xff0c;它的核心思想是将资源作为 API 的核心&#xff0c;使用 HTTP 的 GET、POST、PUT、DELETE 等方法对这些资源进行操作&#xff0c;并通过 URL 来定位资源。 RESTful API的特点包括&#xff1a; 资源是 API 的核心使用 H…...

Git+Gitee使用分享

GitGitee快速入门 创建仓库 ​ ​ ​ 初始化本地仓库 验证本地git是否安装好 打开cmd窗口&#xff0c;输入git ​ 这样就OK。 Git 全局设置:(只需要设置一次) 这台电脑如果是第一次使用git&#xff0c;就需要这样初始化一下&#xff0c;这样才知道是谁提交到仓库了。 git confi…...

【3D激光SLAM】LOAM源代码解析--transformMaintenance.cpp

系列文章目录 【3D激光SLAM】LOAM源代码解析–scanRegistration.cpp 【3D激光SLAM】LOAM源代码解析–laserOdometry.cpp 【3D激光SLAM】LOAM源代码解析–laserMapping.cpp 【3D激光SLAM】LOAM源代码解析–transformMaintenance.cpp 写在前面 本系列文章将对LOAM源代码进行讲解…...

DiscuzQ 二开教程(7)——二次开发版本部署文档

DiscuzQ 二开教程&#xff08;7&#xff09;——二次开发版本部署文档 源码&#xff1a;Discuz-Q-V3: 本仓库为Discuz-Q V3.0.211111 版本的二次开发版本&#xff0c;是将DiscuzQ官方仓库进行合并代码&#xff08;All in One&#xff09;整理后的仓库&#xff0c;使用更方便。…...

u盘数据丢失但占内存如何恢复?不要着急,这里有拯救方案

U盘数据丢失但占内存如何恢复&#xff1f;数据丢失是一种让人非常头疼的问题&#xff0c;尤其是当我们的U盘数据丢失了&#xff0c;但内存仍然被占用时&#xff0c;更令人困惑和焦虑。然而&#xff0c;不要慌张&#xff01;在本文中&#xff0c;将为大家介绍一些有效的方法来恢…...

springboot日志文件名称为什么叫logback-spring.xml

如题&#xff0c;为什么springboot日志配置文件叫logback-spring.xml&#xff1f; 在整个项目中搜索 logback-spring.xml 并没有搜索到。 先看一下 org.springframework.boot.context.logging.LoggingApplicationListener#initialize protected void initialize(ConfigurableEn…...

Mysql 开窗函数(窗口函数)

文章目录 全部数据示例1&#xff08;说明&#xff09;开窗函数可以比groupby多查出条件列外的字段&#xff0c;开窗函数主要是为了跟聚合函数一起使用&#xff0c;达到分组统计效果&#xff0c;并且开窗函数的结果集基本都是跟总行数一样示例2示例3示例4错误示例1错误示例2错误…...

计算机视觉之图像特征提取

图像特征提取是计算机视觉中的重要任务&#xff0c;它有助于识别、分类、检测和跟踪对象。以下是一些常用的图像特征提取算法及其简介&#xff1a; 颜色直方图&#xff08;Color Histogram&#xff09;&#xff1a; 简介&#xff1a;颜色直方图表示图像中各种颜色的分布情况。通…...

【面试经典150题】移除元素·JavaScript版

题目来源 大致思路&#xff1a;遍历数组&#xff0c;如果遇到值为val的元素&#xff0c;使用数组最后一个元素替换它。详细过程&#xff1a; /*** param {number[]} nums* param {number} val* return {number}*/ var removeElement function(nums, val) {let i0,nnums.leng…...

Cesium 相机的三种放置方式

文章目录 Cesium 相机的三种放置方式第一种&#xff1a;setView 计算视角1. Cartesian3 方式2. Rectangle 方式 第二种&#xff1a;flyTo第三种&#xff1a;lookAt Cesium 相机的三种放置方式 Cesium 提供了三种方式对相机的位置进行摆放 第一种&#xff1a;setView 计算视角 …...

看了我这篇帖子,你还会觉得制作电子杂志很难吗?

如果你也像我一样笨手笨脚的不会设计排版制作杂志也没关系&#xff0c;用FLBOOK就能在线制作电子杂志&#xff0c;效果极好&#xff01; 工具&#xff1a;FLBOOK 步骤如下&#xff1a; 1.打开FLBOOK在线制作电子杂志平台 2.点击开始创作&#xff0c;有四个创建作品的方式&…...

SRE 与开发的自动化协同 -- 生产环境出现 bug 自动生成异常追踪

简介 生产环境 bug 的定义&#xff1a;RUM 应用和 APM 应用的 error_stack 信息被捕捉后成为 bug。 以 APM 新增错误巡检为例&#xff0c;当出现新错误时&#xff0c;在观测云控制台的「事件」模块下生成新的事件报告&#xff0c;捕捉为 bug。同时利用 Dataflux Func 创建异常…...

【简单认识Docker基本管理】

文章目录 一、Docker概述1、定义2.容器化流行的原因3.Docker和虚拟机的区别4.Docker核心概念 二、安装docker三、镜像管理1.搜索镜像2.下载&#xff08;拉取&#xff09;镜像3.查看已下载镜像4.查看镜像详细信息5.修改镜像标签6.删除镜像7.导出镜像文件和拉取本地镜像文件8.上传…...

设备管理系统是什么?的修设备管理系统有什么功能?

随着计算机技术的迅速发展和移动互联网的商业化和社会化应用&#xff0c;设备的种类和数量急剧增加。如何利用先进的网络技术和快速更新的计算机设备来有效地收集和处理设备信息&#xff0c;建立以信息化为核心的管理体系&#xff0c;减轻管理和业务人员的数据处理负担&#xf…...

Docker安装并配置Pushgateway

Linux下安装Docker请参考&#xff1a;Linux安装Docker 简介 Pushgateway是Prometheus的一个组件&#xff0c;prometheus server默认是通过Exporter主动获取数据&#xff08;默认采取pull拉取数据&#xff09;&#xff0c;Pushgateway则是通过exporter主动方式推送数据到Pushg…...

汽车OTA活动高质量发展的“常”与“新”

伴随着车主的频繁崔更&#xff0c;车企除了卷硬件、拼价格&#xff0c;逐渐将精力转移到汽车全生命周期的常用常新。时至下半年&#xff0c;车企OTA圈愈发热闹&#xff0c;以新势力、新实力为代表新一代车企&#xff0c;OTA运营活动逐渐进入高质量发展期。 所谓高质量&#xf…...

C++信息学奥赛1121:计算矩阵边缘元素之和

题解&#xff1a;i0 or j0 or in-1 or jm-1 or in-1 or jm-1 代码&#xff1a; #include<iostream> // 包含输入输出流库 #include<cmath> // 包含数学函数库 using namespace std; // 使用标准命名空间int main() {int n,m;cin>>n>>m; // 输入…...