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

【前端面试题】变量提升、闭包、promise

飞书面试

题目1:

async function foo() {console.log('foo start');await bar();console.log('foo end');
}async function bar() {console.log('bar start');return new Promise((resolve, reject) => {setTimeout(() => {console.log('bar promise');resolve();}, 1000);});
}console.log('script start');
foo();
setTimeout(() => {console.log('settimeout');
}, 0);

分析:
首先打印script start。
然后调用foo函数,在foo函数内部先打印foo start,接着等待bar函数。
在bar函数内部,先打印bar start,然后返回一个 1 秒后resolve的Promise。
1 秒后,Promise解决,打印bar promise,然后回到foo函数,打印foo end。
最后执行setTimeout中的函数,打印settimeout。

script start
foo start
bar start
bar promise
foo end
settimeout

以下是几道包含 awaitasync 以及 new 立即执行相关内容,考查执行顺序的题目及详细解析:

题目 1:

async function asyncFunc1() {console.log('asyncFunc1 start');const result = await new Promise((resolve) => {console.log('Inside new Promise of asyncFunc1');resolve(10);});console.log('asyncFunc1 got result:', result);console.log('asyncFunc1 end');
}async function asyncFunc2() {console.log('asyncFunc2 start');const innerPromise = new Promise((resolve) => {console.log('Inside new Promise of asyncFunc2');setTimeout(() => {resolve(20);console.log('Timeout resolved in asyncFunc2');}, 500);});const result = await innerPromise;console.log('asyncFunc2 got result:', result);console.log('asyncFunc2 end');
}console.log('Script start');
asyncFunc1();
asyncFunc2();
console.log('Script end');
解析:
  1. 整体执行开始
    首先会执行同步代码,遇到 console.log('Script start');,会直接打印出 Script start

  2. 调用 asyncFunc1 函数

    • 进入 asyncFunc1 函数后,先打印 asyncFunc1 start,这是函数内的第一个同步代码执行的打印。
    • 接着遇到 await 关键字以及后面跟着的 new Promisenew Promise 的构造函数是同步执行的,所以会立即打印 Inside new Promise of asyncFunc1,然后这个 Promiseresolve,但是由于 await 的存在,函数在此处暂停执行,等待 Promise 完成(其实这里已经完成了,因为是立即 resolve 的),把执行权交回主程序。
  3. 调用 asyncFunc2 函数

    • 进入 asyncFunc2 函数后,先打印 asyncFunc2 start,接着执行 new Promise 的构造函数,这是同步操作,会打印 Inside new Promise of asyncFunc2。不过这个 Promise 内部设置了一个 setTimeoutsetTimeout 是异步的,会在 500 毫秒后执行 resolve,所以当前 asyncFunc2 函数执行到 await 处也暂停了,把执行权交回主程序。
  4. 继续主程序的同步代码
    会执行到 console.log('Script end');,打印出 Script end

  5. 异步操作完成后继续执行

    • 此时主程序同步代码执行完毕,开始处理异步队列中的任务。
    • 对于 asyncFunc1,之前 awaitPromise 已经 resolve,继续执行后面的代码,打印 asyncFunc1 got result: 10asyncFunc1 end
    • 对于 asyncFunc2,500 毫秒后 setTimeout 里的 resolve 执行,然后继续执行后面代码,打印 Timeout resolved in asyncFunc2asyncFunc2 got result: 20asyncFunc2 end

预期输出顺序

Script start
asyncFunc1 start
Inside new Promise of asyncFunc1
asyncFunc2 start
Inside new Promise of asyncFunc2
Script end
asyncFunc1 got result: 10
asyncFunc1 end
Timeout resolved in asyncFunc2
asyncFunc2 got result: 20
asyncFunc2 end

题目 2:

async function firstAsync() {console.log('First async start');const result1 = await new Promise((resolve) => {console.log('Promise in firstAsync created');setTimeout(() => {resolve(5);console.log('Timeout resolved in firstAsync');}, 300);});console.log('First async got result:', result1);console.log('First async end');
}async function secondAsync() {console.log('Second async start');const result2 = await new Promise((resolve) => {console.log('Promise in secondAsync created');resolve(10);});console.log('Second async got result:', result2);console.log('Second async end');
}console.log('Main script start');
firstAsync();
secondAsync();
console.log('Main script end');
解析:
  1. 开始执行
    先执行同步代码,遇到 console.log('Main script start');,打印 Main script start

  2. 调用 firstAsync 函数

    • 进入 firstAsync 函数,打印 First async start,接着遇到 await 及后面的 new Promisenew Promise 的构造函数同步执行,打印 Promise in firstAsync created,但里面的 setTimeout 是异步的,300 毫秒后才会 resolve,所以函数执行到 await 处暂停,执行权交回主程序。
  3. 调用 secondAsync 函数

    • 进入 secondAsync 函数,打印 Second async start,然后执行 new Promise 的构造函数,打印 Promise in secondAsync created,此 Promise 立即 resolve,不过由于 await,会暂停在此处等待 Promise 完成(实际已经完成),执行权交回主程序。
  4. 继续主程序同步代码
    执行 console.log('Main script end');,打印 Main script end

  5. 异步操作完成后继续执行

    • 对于 secondAsync,之前 awaitPromise 已完成,继续执行后面代码,打印 Second async got result: 10Second async end
    • 300 毫秒后,firstAsyncsetTimeoutresolve 执行,然后继续执行后面代码,打印 Timeout resolved in firstAsyncFirst async got result: 5First async end

预期输出顺序

Main script start
First async start
Promise in firstAsync created
Second async start
Promise in secondAsync created
Main script end
Second async got result: 10
Second async end
Timeout resolved in firstAsync
First async got result: 5
First async end

题目 3:

async function outerAsync() {console.log('Outer async start');const innerPromise = new Promise((resolve) => {console.log('Inner promise created');const innerAsync = async () => {console.log('Inner async start');const result = await new Promise((innerResolve) => {console.log('Inner inner promise created');innerResolve(15);});console.log('Inner async got result:', result);console.log('Inner async end');resolve(result);};innerAsync();});const outerResult = await innerPromise;console.log('Outer async got result:', outerResult);console.log('Outer async end');
}console.log('Script begins');
outerAsync();
console.log('Script continues');
解析:
  1. 开始执行
    执行同步代码,打印 Script begins

  2. 调用 outerAsync 函数

    • 进入 outerAsync 函数,打印 Outer async start
    • 接着执行 new Promise 的构造函数,打印 Inner promise created
    • 然后定义并调用 innerAsync 函数,进入 innerAsync 函数后,打印 Inner async start,再遇到 await 及后面的 new Promise,这个 new Promise 的构造函数同步执行,打印 Inner inner promise created,然后立即 resolve,由于 await,暂停在这等待 Promise 完成(实际已完成),执行权交回 outerAsync 函数中 new Promise 的代码处(也就是 innerAsync 函数外面那层 Promise)。
  3. 继续 outerAsync 函数
    此时 innerAsync 函数里的 await 暂停了,但 outerAsync 函数里 new Promise 中定义的 innerAsync 函数已经执行了,接着执行 resolve(result)result 就是 innerAsyncawait 得到的值 15),然后由于 outerAsync 函数里也有 await 等待这个 new Promise,会暂停在这,执行权交回主程序。

  4. 继续主程序同步代码
    执行 console.log('Script continues');,打印 Script continues

  5. 异步操作完成后继续执行

    • 此时主程序同步代码执行完了,开始处理异步队列。outerAsync 函数里 awaitnew Promise 已经 resolve,继续执行后面代码,打印 Outer async got result: 15Outer async end

预期输出顺序

Script begins
Outer async start
Inner promise created
Inner async start
Inner inner promise created
Script continues
Inner async got result: 15
Inner async end
Outer async got result: 15
Outer async end

这些题目涵盖了 asyncawaitnew Promise(包括立即执行 resolve 和带异步操作如 setTimeout 后执行 resolve 的情况)之间的交互以及执行顺序的考查,希望能帮助你加深对这部分知识的理解和掌握。

当然可以,以下是原始代码和将 var 改为 let 后的代码的对比,以及它们的输出结果和解释。

var提升/闭包

var result = [];
var a = 3;
var total = 0;function foo(a) {var i = 0;for (; i < 3; i++) {result[i] = function() {total += i * a;console.log(total);};}
}foo(1);
result[0]();
result[1]();
result[2]();

输出结果:

3
6
9

解释:

  • var 声明的 i 是函数作用域的,所以在循环结束后,i 的值为 3。
  • 每个闭包都捕获了同一个 i 变量,因此当这些闭包被调用时,它们都使用 i 的最终值 3。
  • a 的值在 foo 函数调用时被设置为 1,并且由于 var 声明的变量是函数作用域的,所以所有闭包都使用这个值。

修改后的代码(使用 let,仅修改 i

var result = [];
var a = 3;
var total = 0;function foo(a) {for (let i = 0; i < 3; i++) {result[i] = function() {total += i * a;console.log(total);};}
}foo(1);
result[0]();
result[1]();
result[2]();

输出结果:

0
1
3

解释:

  • let 声明的 i 是块作用域的,每个循环迭代都创建了一个新的 i 变量。
  • 每个闭包捕获了其对应迭代的 i 值,因此当这些闭包被调用时,它们分别使用 0、1 和 2。
  • a 的值在 foo 函数调用时被设置为 1,并且由于 var 声明的变量是函数作用域的,所以所有闭包都使用这个值。

全部使用 let 的代码

let result = [];
let a = 3;
let total = 0;function foo(a) {for (let i = 0; i < 3; i++) {result[i] = function() {total += i * a;console.log(total);};}
}foo(1);
result[0]();
result[1]();
result[2]();

输出结果:

0
1
3

解释:

  • 与上一个修改后的代码相同,因为 let 声明的 i 是块作用域的,每个闭包捕获了其对应迭代的 i 值。
  • atotal 也是块作用域的,但由于它们在全局作用域中声明,它们的行为与之前使用 var 时相同。

全部使用 let,包括 foo 函数内部的 a

let result = [];
let a = 3;
let total = 0;function foo() {let a = 1; // 这个 'a' 只在 foo 函数内部可见for (let i = 0; i < 3; i++) {result[i] = function() {total += i * a; // 这里使用的是函数内部的 'a'console.log(total);};}
}foo();
result[0]();
result[1]();
result[2]();

输出结果:

0
1
3

解释:

  • foo 函数内部的 a 被设置为 1,并且由于 let 声明的变量是块作用域的,所以所有闭包都使用这个值。
  • 每个闭包捕获了其对应迭代的 i 值,因此当这些闭包被调用时,它们分别使用 0、1 和 2。

当然,这里是每个练习题的答案和解释:

补充些类似的题目:

题目 1

for (var i = 0; i < 3; i++) {setTimeout(function() {console.log(i);}, 100 * i);
}

答案: 这段代码会输出 3 3 3

解释: 在这个例子中,var 声明的变量 i 是函数作用域的。当 setTimeout 函数被调用时,它们会将当前的 i 值(在循环结束后为 3)捕获到闭包中。由于所有的 setTimeout 回调都共享同一个 i 变量,它们都打印出循环结束后的 i 值,即 3

题目 2

for (let i = 0; i < 3; i++) {setTimeout(function() {console.log(i);}, 100 * i);
}

答案: 这段代码会输出 0 1 2

解释: 使用 let 声明的变量 i 是块作用域的,这意味着每次循环迭代都会创建一个新的 i 变量。因此,每个 setTimeout 回调都捕获了其对应迭代的 i 值。当这些回调被执行时,它们打印出各自捕获的 i 值,即 012

题目 3

function createFunctions() {var funcs = [];for (var i = 0; i < 3; i++) {funcs[i] = function() {return i * i;};}return funcs;
}var funcs = createFunctions();
console.log(funcs[0]()); // ?
console.log(funcs[1]()); // ?
console.log(funcs[2]()); // ?

答案: 这段代码会输出 9 9 9

解释: 与题目 1 类似,var 声明的变量 i 是函数作用域的。当这些函数被创建时,它们都捕获了同一个 i 变量。当这些函数被调用时,循环已经结束,i 的值为 3。因此,每个函数都返回 3 * 3,即 9

题目 4

function createFunctions() {var funcs = [];for (let i = 0; i < 3; i++) {funcs[i] = function() {return i * i;};}return funcs;
}var funcs = createFunctions();
console.log(funcs[0]()); // ?
console.log(funcs[1]()); // ?
console.log(funcs[2]()); // ?

答案: 这段代码会输出 0 1 4

解释: 使用 let 声明的变量 i 是块作用域的,每个循环迭代都创建了一个新的 i 变量。每个闭包都捕获了其对应迭代的 i 值。因此,第一个函数返回 0 * 0,即 0;第二个函数返回 1 * 1,即 1;第三个函数返回 2 * 2,即 4

题目 5

function getClosure() {var a = 10;function closure() {return a;}return closure;
}var myClosure = getClosure();
console.log(myClosure()); // ?

答案: 这段代码会输出 10

解释:getClosure 函数中,var 声明的变量 a 是函数作用域的。闭包 closure 捕获了 a 的值。当 myClosure 被调用时,它返回 a 的值,即 10

题目 6

function getClosureWithLet() {let b = 20;function closure() {return b;}return closure;
}var myClosure = getClosureWithLet();
console.log(myClosure()); // ?

答案: 这段代码会输出 20

解释:getClosureWithLet 函数中,let 声明的变量 b 是块作用域的。闭包 closure 捕获了 b 的值。当 myClosure 被调用时,它返回 b 的值,即 20。这与使用 var 的情况类似,因为 b 的作用域是 getClosureWithLet 函数内部,闭包能够访问它。

相关文章:

【前端面试题】变量提升、闭包、promise

飞书面试 题目1&#xff1a; async function foo() {console.log(foo start);await bar();console.log(foo end); }async function bar() {console.log(bar start);return new Promise((resolve, reject) > {setTimeout(() > {console.log(bar promise);resolve();}, 1…...

UE5安装Fab插件

今天才知道原来Fab也有类似Quixel Bridge的插件&#xff0c;于是立马就安装上了&#xff0c;这里分享一下安装方法 在Epic客户端 - 库 - Fab Library 搜索 Fab 即可安装Fab插件 然后重启引擎&#xff0c;在插件面板勾选即可 然后在窗口这就有了 引擎左下角也会多出一个Fab图标…...

数据分析思维(一):业务指标(数据分析并非只是简单三板斧)

个人认为&#xff0c;数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python&#xff0c;更重要的是数据分析思维。没有数据分析思维和业务知识&#xff0c;就算拿到一堆数据&#xff0c;也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》&#x…...

linux下socket本地套接字通讯

使用套接字除了可以实现网络间不同主机间的通信外&#xff0c;还可以实现同一主机的不同进程间的通信&#xff0c;且建立的通信是双向的通信。socket进程通信与网络通信使用的是统一套接口&#xff0c;只是地址结构与某些参数不同。 用途 进程间通信&#xff1a;本地套…...

vmcore和kdump

在Linux系统中&#xff0c;vmcore是指内核崩溃时生成的内存转储文件。这个文件包含了系统崩溃时的内存状态&#xff0c;可以用于分析和诊断内核崩溃的原因。分析vmcore文件通常需要使用专门的工具和方法。以下是关于vmcore的一些关键点&#xff1a; 生成vmcore Kdump&#xf…...

[线段树] 回转寿司

题目描述 酷爱日料的小 Z Z Z 经常光顾学校东门外的回转寿司店。在这里&#xff0c;一盘盘寿司通过传送带依次呈现在小Z眼前。 不同的寿司带给小Z的味觉感受是不一样的&#xff0c;我们定义小 Z Z Z 对每盘寿司都有一个满意度。 例如小 Z Z Z 酷爱三文鱼&#xff0c;他对…...

RobotFrameWork详解-RF框架脚本测试集成

Robot Framework是一款python编写的功能自动化测试框架。具备良好的可扩展性&#xff0c;支持关键字驱动&#xff0c;可以同时测试多种类型的客户端或者接口&#xff0c;可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试驱动开发(ATDD)。 之前讲过很多RF框架的内…...

【操作系统】实验八:添加/proc文件系统

实验八 添加/proc文件系统 8.1 实验目的 通过加载内核模块&#xff0c;为/proc文件系统创建以下内容&#xff1a; 一个名叫proc_test的子目录。 一个名叫current的文件&#xff0c;只读&#xff0c;读出的内容是读它的进程的情况。 一个名叫current_too的链接&#xff0c;…...

操作系统(8)死锁

一、概念 死锁是指在一个进程集合中的每个进程都在等待只能由该集合中的其他进程才能引起的事件&#xff0c;而无限期地僵持下去的局面。在多任务环境中&#xff0c;由于资源分配不当&#xff0c;导致两个或多个进程在等待对方释放资源时陷入无限等待的状态&#xff0c;这就是死…...

3D 生成重建039-Edify 3D:Nvidia的3D生成大模型

3D 生成重建039-Edify 3D:Nvidia的3D生成大模型 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 文档介绍了Edify 3D&#xff0c;一种为高质量的3D资产生成而设计的高级解决方案。首先在多个视点上合成了所描述对象的RGB和表面法线图像正在使用扩散模型。然后使用多视图…...

vue绕过rules自定义编写动态校验

今天犯了个低级错误&#xff0c;虽然走了很多弯路&#xff0c;但这个过程还是值得记录一下 例子如下&#xff0c;有两个输入框&#xff1a; 第一个是套餐选择下拉框&#xff0c;可以下拉选择三个内容 第二个要根据上面的套餐选择三个选项来决定怎么显示&#xff0c;使用v-if&…...

.NET中的JSON序列化库:Newtonsoft.Json与System.Text.Json对比与示例

在.NET生态系统中&#xff0c;存在多个用于JSON序列化的库&#xff0c;其中最为常用和知名的包括Newtonsoft.Json&#xff08;也称为Json.NET&#xff09;和System.Text.Json。以下是这两个库的区别&#xff1a; Newtonsoft.Json&#xff08;Json.NET&#xff09; 功能与灵活…...

Electron-Vite 项目搭建(Vue)

前提条件 Node.js: 确保已安装 Node.js 版本 18 或更高版本 (推荐使用最新稳定版)。Vite: 确保 Vite 版本为 4.0 或以上。包管理工具: 推荐使用 pnpm&#xff0c;但也可以使用 npm 或 yarn。 安装 Electron-Vite 首先&#xff0c;在项目中安装 electron-vite 作为开发依赖&a…...

Elasticsearch Java Api Client中DSL语句的查询方法汇总

说明&#xff1a;示例代码依赖的是co.elastic.clients:elasticsearch-java:8.16.1。 1、termQuery 方法 用途&#xff1a;用于精确匹配某个字段的完全相等的值。这在查询如文档的 ID、状态码等具有明确取值的字段时非常有用。参数说明&#xff1a; field&#xff1a;这是一个…...

Linux之远程登录

一、使用ssh命令登录 winR打开cmd输入命令 # root是命令&#xff0c;192.168.101.200是地址 ssh root192.168.101.200是否要保存密码&#xff0c;就是yes以后可以免密登录&#xff0c;这里就yes了 输入密码&#xff0c;就登录成功了 操作完成之后&#xff0c;输入命令退出 e…...

医学图像分割数据集腹部肝脏多器官图像分割数据集labelme格式860张10类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;860 标注数量(json文件个数)&#xff1a;860 标注类别数&#xff1a;10 标注类别名称:["liver","stomach","o…...

Xerces-C,一个成熟的 C++ XML 解析库!

嗨&#xff0c;大家好&#xff01;我是一行。今天咱们来探索 Xerces-C&#xff0c;它可是 C里超棒的 XML 解析库哦&#xff01;能帮咱轻松处理 XML 数据&#xff0c;在很多数据交互、配置文件读取场景都超实用&#xff0c;快来一起学习使用它的妙招吧。 一、Xerces-C 是什么&am…...

go语言中context的用法

0 概述 Context 是 Go 语言中非常重要的一个概念&#xff0c;它主要用于跨多个函数或 goroutine 传递 取消信号、超时控制、截止时间 和 请求范围数据。在并发编程中&#xff0c;Context 提供了更好的控制和管理&#xff0c;尤其是当你需要在多个 goroutine 之间传递状态或进行…...

UE5编辑器下将RenderTarget输出为UTexture并保存

在使用UE5开发项目时&#xff0c;RenderTarget是一种非常强大的工具&#xff0c;常用于生成实时纹理效果、后处理和调试。而将RenderTarget的内容转换为UTexture并储存&#xff0c;是许多编辑器内的需求都需要的功能。 1.材质球输出至Texture 首先创建一个Actor类&#xff0c…...

探秘 AI Agent 之 Coze 智能体:从简介到搭建全攻略(4/30)

一、Coze 智能体概述 &#xff08;一&#xff09;Coze 智能体是什么 Coze 智能体是基于机器学习和自然语言处理技术的软件实体&#xff0c;它在人工智能领域扮演着重要的角色&#xff0c;能够像一个智能助手一样&#xff0c;通过与外界环境进行交互学习&#xff0c;进而执行各…...

解决navicat 导出excel数字为科学计数法问题

一、原因分析 用程序导出的csv文件&#xff0c;当字段中有比较长的数字字段存在时&#xff0c;在用excel软件查看csv文件时就会变成科学技术法的表现形式。 其实这个问题跟用什么语言导出csv文件没有关系。Excel显示数字时&#xff0c;如果数字大于12位&#xff0c;它会自动转化…...

蓝桥杯刷题——day4

蓝桥杯刷题——day4 题目一题干题目解析代码 题目二题干题目解析代码 题目一 题干 小蓝和朋友们在玩一个报数游戏。由于今年是2024 年&#xff0c;他们决定要从小到大轮流报出是20或24倍数的正整数。前10个被报出的数是&#xff1a;20,24,40,48,60,72,80,96,100,120。请问第2…...

【AI日记】24.12.13 kaggle 比赛 2-3 大扫除、断舍离、自己做饭

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加&#xff1a;kaggle 比赛 Regression with an Insurance Dataset参考&#xff1a;kaggle 回归类入门比赛 House Prices - Advanced Regression Techniques内容&#xff1a;构建自己的EDA&#xff08…...

http 和 https 的区别?

HTTP (HyperText Transfer Protocol) 和 HTTPS (HyperText Transfer Protocol Secure) 是两种用于在 Web 浏览器和网站服务器之间传输网页的协议&#xff0c;它们的主要区别在于安全性。以下是 HTTP 和 HTTPS 的一些关键区别&#xff1a; 安全性&#xff1a; HTTP&#xff1a;H…...

Mysql数据库中,什么情况下设置了索引但无法使用?

在MySQL数据库中&#xff0c;即使已经正确设置了索引&#xff0c;但在某些情况下索引可能无法被使用。 以下是一些常见的情况&#xff1a; 1. 数据分布不均匀 当某个列的数据分布非常不均匀时&#xff0c;索引可能无法有效地过滤掉大部分的数据&#xff0c;导致索引失效。 …...

[Unity] AppLovin Max接入Native 广告 Android篇

把下载下来的maxnativelibrary-release-文件放在Plugins/Android下 将这一行加入到mainTemplate.gradle文件中 implementation androidx.constraintlayout:constraintlayout:2.1.4添加下面的两个脚本 using System; using System.Collections; using System.Collections.Gener…...

青少年夏令营管理系统的设计与开发(社团)+开题报告(springboot+freemarker)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...

JSSIP的使用及问题(webRTC,WebSockets)

简介 项目中有一个需要拨打电话的功能&#xff0c;要求实时的进行音频接听&#xff0c;并且可以在电话接听或者挂断等情况下做出相应的操作。jssip作为一个强大的实现实时通信的javascript库&#xff0c;这不门当户对了嘛。 jssip&#xff08;官网&#xff1a; JsSIP - the J…...

13.继承和多态的实例 C#

这是一个动物园的动物发出不同的声音&#xff0c;使用了继承和多态 using System; using System.Collections.Generic;namespace InheritanceAndPolymorphismExample {//一个动物类&#xff0c;包含属性&#xff1a;名称。包含方法&#xff1a;发出叫声public class Animal{pub…...

Vue3之入门介绍

Vue 3是一种用于构建用户界面的渐进式JavaScript框架。它主要用于创建单页应用(SPA)&#xff0c;具备响应式数据绑定、组件化开发、虚拟DOM等核心特性&#xff0c;使得开发者能够高效地构建复杂的前端应用。Vue 3相比于之前的版本&#xff0c;进行了大量的性能优化和功能改进&a…...

Unity3D仿星露谷物语开发3之动画系统初探

1、目标 我们希望使用已有的资源建一个动画demo&#xff0c;以此熟悉基于已有Animator/Animation资源的使用方法。 以Tree的动画系统为例&#xff0c;资源位于&#xff1a; 2、创建流程 &#xff08;1&#xff09;创建tree空对象 上面两个都是空对象。 &#xff08;2&#…...

【研发经验】工作流和规则引擎的应用与场景

工作流引擎和规则引擎是两种常见的软件技术&#xff0c;可以被应用于各种场景中&#xff0c; 例如&#xff1a; 业务流程自动化&#xff1a;工作流引擎可以用于自动化和管理各种业务流程&#xff0c;例如审批流程&#xff0c;订单处理流程&#xff0c;客户服务流程等。它可以定…...

UDP对比TCP的网络编程接口

目录 一、UDP网络编程接口 1.创建套接字(客户端、服务端) 2.套接字绑定地址(客户端、服务端) 3.发送数据(客户端、服务端) 4.接收数据(客户端、服务端) 二、TCP网络编程接口 1.创建套接字&#xff08;客户端、服务端&#xff09; 2.套接字绑定地址&#xff08;客户端、服…...

C# 探险之旅:第二十七节 - 类型class(属性) —— 给你的类穿上“属性”的外衣

嘿&#xff0c;探险家们&#xff01;欢迎再次踏上我们的C#奇幻之旅。今天&#xff0c;我们要聊聊一个超级有趣的话题——类的“属性”。想象一下&#xff0c;如果我们要给类穿上一件酷炫的外衣&#xff0c;那属性就是这件外衣上的各种口袋和装饰&#xff0c;让类变得既实用又拉…...

《饕餮记》精彩片段(一)

也是无意中看到鲛人脍单元集片段&#xff0c;才去看了这个剧 整体略架空和部分逻辑不是很连贯和完美 精彩点不在于整体和走向和故事线 也不在于大牌明星撑场&#xff0c;因为全场只有安悦溪一个脸熟明星撑场子 而在于每个单元间离奇小故事 和华胥引差不多&#xff0c;属于逻…...

esxi8 虚拟机使用ubuntu22模板后 没有ip配置文件,只有ipv6链接正常使用

esxi8 虚拟机使用模板后 没有ip配置文件&#xff0c;只有ipv6链接正常使用&#xff0c;/etc/NetworkManager/system-connections配置下没有配置文件 只有/etc/netplan/有文件 sudo ip addr add 192.168.1.9/24 dev ens35 # 临时设置ip&#xff0c; 接口名ens35 sudo vi /et…...

C++内存管理

1、代码区 代码区的特点&#xff1a; 1.只读&#xff1a;防止程序运行时修改其执行代码&#xff0c;有助于程序稳定和安全性。 2.共享&#xff1a;多个程序运行可共享同一份代码区&#xff0c;以节省内存。 3.固定大小&#xff1a;代码区的大小在程序编译连接时就已经确定&a…...

分类算法评估标准综述

目录 ​编辑 混淆矩阵&#xff08;Confusion Matrix&#xff09; 准确率&#xff08;Accuracy&#xff09; 精确率&#xff08;Precision&#xff09; 召回率&#xff08;Recall&#xff09; F1分数&#xff08;F1 Score&#xff09; ROC曲线和AUC值 P-R曲线 马修斯相…...

基于windows环境使用nvm安装多版本nodejs

目录 前言 一、卸载node 二、nvm是什么&#xff1f; 三、nvm安装 1.官网下载 nvm 包 2. 安装nvm-setup.exe 3. 配置路径和下载镜像 4. 检查安装是否完成 四、 使用nvm安装node 五、修改npm默认镜像源为淘宝镜像 六、环境变量配置 1. 新建目录 2. 设置环境变量 七…...

【人工智能-中级】神经网络的调优与正则化策略

文章目录 神经网络的调优与正则化策略1. 神经网络调优策略学习率调整批量大小(Batch Size)优化算法2. 正则化策略L1与L2正则化Dropout数据增强3. 超参数优化4. 小结神经网络的调优与正则化策略 在深度学习中,训练一个高效且准确的神经网络模型不仅依赖于选择合适的架构,还…...

VBA 连续打印多个内容成PDF

VBA 连续打印多个内容成PDF Dim wb As Workbook Dim sht1 As Worksheet Set sht1 ActiveSheet PT ThisWorkbook.PathApplication.ScreenUpdating FalseApplication.DisplayAlerts FalseApplication.Calculation xlCalculationManual For i [aa2] To [ab2][ad2] iSet wb …...

【Linux网络编程】第十弹---打造初级网络计算器:从协议设计到服务实现

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、Protocol.hpp 1.1、Request类 1.1.1、基本结构 1.1.2、构造析构函数 1.1.3、序列化函数 1.1.4、反…...

嵌入式 linux Git常用命令 抽补丁 打补丁

Git常用命令 为什么要学习git呢&#xff1f;我相信刚入门的小伙伴敲打肯定碰到过这种玄学问题&#xff0c;我明明刚刚还能用的代码&#xff0c;后面不知道咋的就不能用了&#xff0c;所以每次你调出一个功能点以后都会手动复制一份代码防止出问题&#xff0c;时间一长发现整个…...

windows C#-方法概述(上)

方法是包含一系列语句的代码块。 程序通过调用该方法并指定任何所需的方法参数使语句得以执行。 在 C# 中&#xff0c;每个执行的指令均在方法的上下文中执行。 Main 方法是每个 C# 应用程序的入口点&#xff0c;并在启动程序时由公共语言运行时 (CLR) 调用。 在使用顶级语句的…...

SpringCloud和Nacos的基础知识和使用

1.什么是SpringCloud ​ 什么是微服务&#xff1f; ​ 假如我们需要搭建一个网上购物系统&#xff0c;那么我们需要哪些功能呢&#xff1f;商品中心、订单中心和客户中心等。 ​ 当业务功能较少时&#xff0c;我们可以把这些功能塞到一个SpringBoot项目中来进行管理。但是随…...

一行一行出字的视频怎么做?简单的操作方法

在视频制作中&#xff0c;逐行出现的字幕效果不仅能够增强视觉冲击力&#xff0c;还能让观众更加专注于内容&#xff0c;特别适合用于教育视频、书单推荐、诗歌朗诵等多种场景。下面&#xff0c;我们将详细介绍如何影忆&#xff0c;来制作这种逐行出字的视频效果。 1.字幕逐行…...

鸿蒙NEXT开发案例:颜文字搜索器

【引言】 本文将介绍一个名为“颜文字搜索器”的开发案例&#xff0c;该应用是基于鸿蒙NEXT平台构建的&#xff0c;旨在帮助用户快速查找和使用各种风格的表情符号。通过本案例的学习&#xff0c;读者可以了解如何在鸿蒙平台上进行数据处理、UI设计以及交互逻辑的实现。 【环…...

python在纯文本程序里面藏一张图

思路base64编码是纯文本的,base64是以字符串的形式存在,包括但不限于python,js,C#,C/Cpp. 这里给出python示例:运行后可以显示一张opencv的官方例程图. 废话不说,上程序. import os,sys,time,cv2,base64,requests from PIL import Image from io import BytesIO import nump…...

Java 身份证校验工具类(15位校验、18位校验与15转18)

文章目录 身份证简介&#xff08;一&#xff09;身份证号码的组成&#xff08;二&#xff09;一代和二代身份证一代身份证二代身份证 检验思路分析&#xff08;一&#xff09;15位身份证号码&#xff08;二&#xff09;18位身份证号码&#xff08;三&#xff09;校验算法示例&a…...

The Past, Present and Future of Apache Flink

摘要&#xff1a;本文整理自阿里云开源大数据负责人王峰&#xff08;莫问&#xff09;在 Flink Forward Asia 2024上海站主论坛开场的分享&#xff0c;今年正值Flink开源项目诞生的第10周年&#xff0c;借此时机&#xff0c;王峰回顾了Flink在过去10年的发展历程以及 Flink社区…...