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

裸辞8年前端的面试笔记——JavaScript篇(一)

裸辞后的第二个月开始准备找工作,今天是第三天目前还没有面试,现在的行情是一言难尽,都在疯狂的压价。

下边是今天复习的个人笔记

一、事件循环

JavaScript 的事件循环(Event Loop)是其实现异步编程的关键机制。

从原理上讲,JavaScript 是单线程语言,只有一个主线程来执行代码,这意味着同一时间只能做一件事。但为了实现异步操作(比如处理用户交互、网络请求等),引入了事件循环机制。
事件循环涉及到几个重要概念:

  1. 调用栈(Call Stack): 是一种数据结构,用于记录函数的调用关系。函数调用时入栈,执行完毕后出栈。
  2. 任务队列(Task Queue): 也叫消息队列,用于存放异步操作的回调函数。当异步操作完成时,对应的回调函数会被放入任务队列。
  3. 宏任务(Macrotask): 包括 script (整体代码)、setTimeout、setInterval、setImmediate(Node.js 环境)、requestAnimationFrame 等。
  4. 微任务(Microtask): 包括 Promise 的 then、catch、finally,MutationObserver 等。

事件循环的执行过程大致如下:

  1. 首先执行调用栈中的同步任务。
  2. 当遇到异步任务时,异步任务会被挂起,不会阻塞主线程,继续执行同步任务。
  3. 当同步任务执行完毕后,开始处理微任务队列,依次执行微任务队列中的任务。
  4. 微任务执行完毕后,开始执行宏任务队列中的任务,每执行一个宏任务,就会检查并执行微任务队列。
  5. 重复上述过程,不断循环,这就是事件循环。

例如:

console.log('start');setTimeout(() => {console.log('setTimeout');
}, 0);Promise.resolve().then(() => {console.log('Promise then');
});console.log('end');

在这段代码中,首先 console.log('start') console.log('end') 作为同步任务在调用栈中依次执行。setTimeout 是宏任务,会被放到宏任务队列。Promise.resolve().then() 是微任务,会被放到微任务队列。当同步任务执行完后,开始执行微任务队列中的 Promisethen 回调,打印 Promise then,最后执行宏任务队列中的 setTimeout 回调,打印 setTimeout

二、Promise.all 和 Promise.race

Promise.all 和 Promise.race ,它们都是 Promise 的静态方法,在处理多个 Promise 时非常有用,以下是它们的详细介绍:

Promise.all

  • 它接受一个包含多个 Promise 对象的可迭代对象(比如数组)作为参数。
  • 只有当传入的所有 Promise 都成功时,Promise.all 才会返回一个成功的 Promise,其结果是一个包含所有 Promise 结果的数组,顺序和传入的 Promise 顺序一致。
  • 只要有一个 Promise 失败,Promise.all 就会立即返回一个失败的 Promise,失败原因就是第一个失败的 Promise 的原因。

例如:

const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve(3);Promise.all([promise1, promise2, promise3]).then((values) => {console.log(values); //输出: [1, 2, 3]}).catch((error) => {console.error(error);});

有失败的Promise:

const promise1 = Promise.resolve(1);
const promise2 = Promise.reject(new Error('Promise 2 failed'));
const promise3 = Promise.resolve(3);Promise.all([promise1, promise2, promise3]).then((values) => {console.log(values); // 不会输出}).catch((error) => {console.error(error.message); // 输出: Promise 2 failed});

Promise.race

  • 同样接受一个包含多个 Promise 对象的可迭代对象作为参数。
  • 只要其中一个 Promise 率先改变状态(无论是成功还是失败),Promise.race 就会返回这个 Promise 的结果或原因。

例如:

const promise1 = new Promise((resolve, reject) => {setTimeout(() => {resolve('Promise 1 resolved');}, 2000);
});const promise2 = new Promise((resolve, reject) => {setTimeout(() => {reject(new Error('Promise 2 failed'));}, 1000);
});Promise.race([promise1, promise2]).then((value) => {console.log(value);}).catch((error) => {console.error(error.message); // Promise 2 failed});

简单来说,Promise.all 强调所有 Promise 都成功,Promise.race 则关注谁先改变状态。

纯JS实现Promise,并集成all和race

下面是一个简单实现 Promise 并添加 all 和 race 方法的代码示例,解释了其基本原理和实现思路:

// 自定义Promise类
function MyPromise(executor) {this.status = 'pending';this.value = null;this.reason = null;this.onResolvedCallbacks = [];this.onRejectedCallbacks = [];const resolve = (val) => {if (this.status === 'pending') {this.status = 'fulfilled';this.value = val;this.onResolvedCallbacks.forEach(callback => callback(this.value));}};const reject = (err) => {if (this.status === 'pending') {this.status ='rejected';this.reason = err;this.onRejectedCallbacks.forEach(callback => callback(this.reason));}};try {executor(resolve, reject);} catch (error) {reject(error);}
}// Promise.prototype.then方法实现
MyPromise.prototype.then = function (onFulfilled, onRejected) {onFulfilled = typeof onFulfilled === 'function'? onFulfilled : value => value;onRejected = typeof onRejected === 'function'? onRejected : reason => { throw reason };let nextPromise;if (this.status === 'fulfilled') {nextPromise = new MyPromise((resolve, reject) => {try {const x = onFulfilled(this.value);resolvePromise(nextPromise, x, resolve, reject);} catch (error) {reject(error);}});}if (this.status ==='rejected') {nextPromise = new MyPromise((resolve, reject) => {try {const x = onRejected(this.reason);resolvePromise(nextPromise, x, resolve, reject);} catch (error) {reject(error);}});}if (this.status === 'pending') {nextPromise = new MyPromise((resolve, reject) => {this.onResolvedCallbacks.push((value) => {try {const x = onFulfilled(value);resolvePromise(nextPromise, x, resolve, reject);} catch (error) {reject(error);}});this.onRejectedCallbacks.push((reason) => {try {const x = onRejected(reason);resolvePromise(nextPromise, x, resolve, reject);} catch (error) {reject(error);}});});}return nextPromise;
};// 辅助函数,处理then方法中返回值的逻辑
function resolvePromise(promise2, x, resolve, reject) {if (promise2 === x) {return reject(new TypeError('Chaining cycle detected for promise'));}if (x instanceof MyPromise) {x.then(resolve, reject);} else if (typeof x === 'object' || typeof x === 'function') {if (x === null) {return resolve(x);}let called = false;try {const then = x.then;if (typeof then === 'function') {then.call(x,(y) => {if (called) return;called = true;resolvePromise(promise2, y, resolve, reject);},(r) => {if (called) return;called = true;reject(r);});} else {resolve(x);}} catch (error) {if (called) return;called = true;reject(error);}} else {resolve(x);}
}// 实现Promise.all方法
MyPromise.all = function (promises) {return new MyPromise((resolve, reject) => {const result = [];let count = 0;if (promises.length === 0) {resolve(result);} else {promises.forEach((p, index) => {MyPromise.resolve(p).then((value) => {result[index] = value;count++;if (count === promises.length) {resolve(result);}}).catch((error) => {reject(error);});});}});
};// 实现Promise.race方法
MyPromise.race = function (promises) {return new MyPromise((resolve, reject) => {promises.forEach((p) => {MyPromise.resolve(p).then((value) => {resolve(value);}).catch((error) => {reject(error);});});});
};

使用自定义的 MyPromise

// 使用示例
const promise1 = new MyPromise((resolve) => {setTimeout(() => {resolve(1);}, 1000);
});const promise2 = new MyPromise((resolve, reject) => {setTimeout(() => {reject(new Error('Promise 2 failed'));}, 500);
});// 使用then方法
promise1.then((value) => {console.log(value);}).catch((error) => {console.error(error);});// 使用all方法
MyPromise.all([promise1, promise2]).then((values) => {console.log(values);}).catch((error) => {console.error(error);});// 使用race方法
MyPromise.race([promise1, promise2]).then((value) => {console.log(value);}).catch((error) => {console.error(error);});

在上述代码中,首先定义了一个 MyPromise 类,实现了基本的 Promise 功能,包括 then 方法。然后添加了 all 和 race 静态方法,分别用于按顺序处理多个 Promise(all)和谁先有结果就返回谁(race)。resolvePromise 函数则处理了 then 方法中返回值的复杂逻辑,确保遵循 Promise/A+ 规范。

三、闭包

闭包是面试中常见的一个考点,复习也是很有必要的,在工作中使用闭包的场景很多比如在Vue和React组件就是个大闭包,还有防抖节流等函数的封装等等。

1. 什么是闭包?

闭包是指函数和与其相关的词法环境的组合。当一个内部函数在其外部函数返回后仍然能访问外部函数的变量时,就创建了闭包。

function outer() {let count = 0;function inner() {count++;console.log(count);}return inner;
}const closureFn = outer();
closureFn(); // 1
closureFn(); // 2

在这个例子中,inner函数形成了闭包,即使 outer 函数已经执行完毕,inner 函数依然可以访问 outer 函数作用域内的 count 变量。

2. 闭包有什么作用?

  • 数据私有性: 可以隐藏变量,通过闭包,外部代码无法直接访问函数内部的变量,只能通过闭包返回的函数来操作这些变量,实现数据的封装。
  • 状态保存: 闭包能记住创建时的状态,比如在计数器的例子中,每次调用闭包函数,都能记住上次 count 的值并进行操作。
  • 柯里化: 闭包是实现函数柯里化的基础,柯里化可以将多参数函数转化为一系列单参数函数,提高函数的复用性和灵活性。柯里化后边会延伸描述

3. 闭包可能会带来什么问题?

  • 内存泄漏: 如果闭包函数一直存在,并且引用了一些大的对象或不再需要的变量,这些变量不会被垃圾回收机制回收,可能会导致内存占用过高,出现内存泄漏。例如:
    function createBigObject() {const bigArray = new Array(1000000).fill(0);return function () {// 闭包函数一直存在,bigArray无法被回收console.log('closure');};
    }const leakyClosure = createBigObject();
    
  • 变量的值不是预期的: 在循环中使用闭包时,如果不注意,可能会得到意外的结果。比如:
    const functions = [];
    for (var i = 0; i < 5; i++) {functions.push(() => {console.log(i);});
    }
    functions.forEach(fn => fn()); 
    // 输出 5 5 5 5 5,因为这里的i是最后循环结束时的值
    
    可以通过立即执行函数或使用 let 关键字来解决这个问题。如下:
    const functions = [];
    for (let i = 0; i < 5; i++) {functions.push(() => {console.log(i);});
    }
    functions.forEach(fn => fn()); 
    // 输出 0 1 2 3 4
    

4. 如何避免闭包导致的内存泄漏?

当闭包不再使用时,手动将闭包函数赋值为 null,这样相关的变量就可以被垃圾回收机制回收。例如:

function createClosure() {let data = { a: 1 };return function () {console.log(data.a);};
}let closureFn = createClosure();
// 使用闭包函数
closureFn();
// 不再使用闭包时,将其赋值为null
closureFn = null;

5. 实际开发中,不专门手动将闭包引用的变量置为null

实际开发中,闭包导致的内存泄漏本质是 “外部引用未正确释放”,而非闭包语法本身的问题。现代 GC 机制和框架已能处理大部分场景,手动置空闭包变量既不现实也无必要。开发者的核心任务是:

  • 正确管理外部依赖(移除事件监听、清除定时器、避免不合理的全局引用);
  • 依赖框架的生命周期钩子处理副作用,让闭包随上下文自然释放。

只有在极端或不规范的场景下,才需针对性地手动清理,但这也应优先通过切断外部引用来实现,而非直接操作闭包内部的变量。

四、柯里化

**柯里化(Currying)**是一种在函数式编程中广泛使用的技术,它允许你将一个多参数函数转换为一系列单参数函数。以下从定义、原理、用途、示例等方面详细介绍柯里化。

定义与原理

  • 定义: 柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。简单来说,就是将一个多参数函数拆分成多个单参数函数。
  • 原理: 利用闭包的特性,让函数记住之前传入的参数,当参数数量达到原函数所需的参数数量时,执行原函数逻辑。

用途

参数复用: 当多次调用同一个函数,并且传递的参数大部分相同时,使用柯里化可以复用这些相同的参数。
延迟计算: 可以在需要的时候再传入剩余的参数进行计算,而不是一次性传入所有参数。
动态创建函数: 根据不同的参数动态生成不同的函数。

示例

以下是一个简单的 JavaScript 示例,展示如何实现柯里化:

// 定义一个普通的加法函数
function add(a, b) {return a + b;
}// 实现柯里化函数
function curry(func) {return function curried(...args) {if (args.length >= func.length) {return func.apply(this, args);} else {return function (...nextArgs) {return curried.apply(this, args.concat(nextArgs));};}};
}// 将 add 函数进行柯里化
const curriedAdd = curry(add);// 使用柯里化函数
const add5 = curriedAdd(5);
console.log(add5(3)); // 输出 8    

代码解释

  • curry 函数: 接受一个函数 func 作为参数,返回一个新的函数 curried。
  • curried 函数: 接受任意数量的参数 args,如果 args 的长度大于或等于原函数 func 的参数长度,则直接调用 func 并返回结果;否则,返回一个新的函数,该函数会将之前的参数和新传入的参数合并后再次调用 curried 函数。
  • curriedAdd 函数: 是 add 函数柯里化后的结果。通过 curriedAdd(5) 得到一个新的函数 add5,这个函数记住了之前传入的参数 5,当调用 add5(3) 时,将 5 和 3 相加并返回结果。

实际应用场景

  • **日志记录:**在日志记录时,通常会有一些固定的参数(如日志级别、日志来源等),可以使用柯里化来复用这些参数。
    function log(level, source, message) {console.log(`[${level}] [${source}] ${message}`);
    }const curriedLog = curry(log);
    const errorLog = curriedLog('ERROR');
    const appErrorLog = errorLog('App');
    appErrorLog('Something went wrong!'); // 输出 [ERROR] [App] Something went wrong!
    
  • 事件处理: 在处理事件时,可能需要传递一些额外的参数,可以使用柯里化来动态创建事件处理函数。
    <!DOCTYPE html>
    <html lang="en"><head><meta charset="UTF-8">
    </head><body><button id="myButton">Click me</button><script>function handleClick(message, event) {console.log(`${message}: ${event.type}`);}const curriedHandleClick = curry(handleClick);const clickWithMessage = curriedHandleClick('Button clicked');const button = document.getElementById('myButton');button.addEventListener('click', clickWithMessage);</script>
    </body></html>
    
    在这个示例中,通过柯里化创建了一个带有固定消息的事件处理函数 clickWithMessage,当按钮被点击时,会输出相应的日志信息。

不推荐使用柯里化的场景

  • 简单一次性调用: 若函数仅调用一次,且参数无复用可能,直接调用普通函数更高效(如 sum(1, 2, 3) 无需柯里化)。
  • 参数顺序依赖强或易混淆: 柯里化要求严格按参数顺序传参,若参数含义不明确(如log('ERROR', 'App', '消息')中 ‘App’ 可能是来源或消息),可能导致调用时参数错位。
  • 追求极致性能的场景: 虽然现代引擎优化较好,但柯里化涉及闭包和多层函数嵌套,在极端高频调用(如循环内)时可能存在微小性能损耗(需实测验证)

总结

  • 用: 当需要参数复用、延迟计算、函数组合或动态生成定制函数,且代码风格兼容函数式思维时。
  • 慎: 当参数逻辑复杂、可读性可能受损,或团队对 FP 不熟悉时,优先考虑更直观的参数传递方式(如对象、默认参数)。

柯里化的核心价值在于将 “不变的部分” 与 “变化的部分” 分离,通过函数的 “预配置” 提高代码的灵活性和复用性。实际开发中,可从小规模场景(如工具函数、配置类函数)开始尝试,逐步判断是否符合项目需求。

相关文章:

裸辞8年前端的面试笔记——JavaScript篇(一)

裸辞后的第二个月开始准备找工作&#xff0c;今天是第三天目前还没有面试&#xff0c;现在的行情是一言难尽&#xff0c;都在疯狂的压价。 下边是今天复习的个人笔记 一、事件循环 JavaScript 的事件循环&#xff08;Event Loop&#xff09;是其实现异步编程的关键机制。 从…...

力扣刷题Day 41:除自身以外数组的乘积(238)

1.题目描述 2.思路 方法1&#xff1a;搞一个数组存放各元素之前所有数的乘积&#xff08;头为1&#xff09;&#xff0c;再搞一个数组存放各元素之后所有数的乘积&#xff08;尾为1&#xff09;。 方法2&#xff1a;上面的方法是很好理解的&#xff0c;在此基础上应该如何优化…...

金仓数据库征文-金仓KES数据同步优化实践:逻辑解码与增量同步

目录 一.同步场景与方案选型 二.同步环境配置 1.前置条件验证 2.逻辑解码配置 三.同步实施与问题排查 1.结构映射规则 2.增量数据捕获 3.数据一致性校验 四.性能调优实践 1.同步线程优化 2.批量提交优化 3.资源监控指标 五.典型场景解决方案 1.双向同步冲突处理 …...

【前端基础】9、CSS的动态伪类(hover、visited、hover、active、focus)【注:本文只有几个粗略说明】

一、什么是伪类 选择器的一种&#xff0c;用于选择处于特定状态的元素。 最常见的现象&#xff1a;鼠标放在某些文字上面&#xff0c;文字就会加上颜色。 鼠标没放上去之前&#xff1a; 鼠标放上去之后&#xff1a; 二、动态伪类 图片来源&#xff08;链接文章也有其他伪…...

企业开发平台大变革:AI 代理 + 平台工程重构数字化转型路径

在企业数字化转型的浪潮中&#xff0c;开发平台正经历着前所未有的技术革命。从 AST&#xff08;抽象语法树&#xff09;到 AI 驱动的智能开发&#xff0c;从微服务架构到信创适配&#xff0c;这场变革不仅重塑了软件开发的底层逻辑&#xff0c;更催生了全新的生产力范式。本文…...

ZooKeeper工作机制与应用场景

目录 1.1、概述1.2、选举机制1.2.1、选举触发条件1.2.2、选举规则1.2.3、选举过程详解 1.3、数据同步机制1.3.1、正常同步1.3.2、宕机同步 1.4、客户端常用命令1.5、应用场景1.5.1、配置管理1.5.2、命令服务1.5.3、分布式锁服务1.5.4、集群管理1.5.5、分布式ID1.5.6、分布式协调…...

VR制作软件用途(VR制作软件概述)

虚拟现实&#xff08;VR&#xff09;制作软件作为现代科技的瑰宝&#xff0c;正以独特的魅力重塑各行各业。 通过构建三维虚拟环境&#xff0c;这些软件提供了前所未有的沉浸式体验&#xff0c;还推动了技术革新与产业升级。本文将探讨VR制作软件的主要用途&#xff0c;并重点…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】电商数据分析案例-9.1 业务场景与数据准备

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 9.1 业务场景与数据准备9.1.1 业务场景描述核心业务目标业务挑战 9.1.2 数据来源与获取数据源构成数据获取方案 9.1.3 数据结构与字段说明核心数据表设计1. 订单事实表&…...

PyTorch 入门与核心概念详解:从基础到实战问题解决

PyTorch 入门与核心概念详解&#xff1a;从基础到实战问题解决 前言 用PyTorch 编写 Transformer 模型时遇到了多个错误&#xff0c;包括维度不匹配、NaN 损失、注意力权重未记录以及 OpenMP 库初始化等问题。 本文基于以上&#xff0c;对 PyTorch 的基本解释&#xff0c;并对…...

【办公类-99-05】20250508 D刊物JPG合并PDF便于打印

背景需求 委员让我打印2024年2025年4月的D刊杂志&#xff0c;A4彩打&#xff0c;单面。 有很多JPG&#xff0c;一个个JPG图片打开&#xff0c;实在太麻烦了。 我需要把多个jpg图片合并成成为一个PDF&#xff0c;按顺序排列打印。 deepseek写Python代码 代码展示 D刊jpg图片合…...

【C++】手搓一个STL风格的string容器

C string类的解析式高效实现 GitHub地址 有梦想的电信狗 1. 引言&#xff1a;字符串处理的复杂性 ​ 在C标准库中&#xff0c;string类作为最常用的容器之一&#xff0c;其内部实现复杂度远超表面认知。本文将通过一个简易仿照STL的string类的完整实现&#xff0c;揭示其设…...

无实体对话式社交机器人 拟人化印象形成机制:基于多模态交互与文化适配的拓展研究

《如何感知AI对话者:无实体对话式社交机器人拟人化对其印象形成效果影响机制的实验研究》解析 一、研究背景与核心问题 (一)技术背景与研究动机 随着生成式AI技术发展,以ChatGPT、文心一言为代表的无实体对话式社交机器人兴起,用户对其高度拟人化特征有显著需求,如扮演…...

存储器:DDR和独立显卡的GDDR有什么区别?

本文来简要对比DDR&#xff08;Double Data Rate SDRAM&#xff09;和GDDR&#xff08;Graphics Double Data Rate SDRAM&#xff09;的区别&#xff0c;重点说明它们在设计、性能和应用上的差异&#xff1a; 1. 设计目标与架构 DDR&#xff1a;通用型DRAM&#xff0c;设计为…...

viewDesign里的table内嵌套select动态添加表格行绑定内容丢失

问题 描述 viewDesign里的table内嵌套select&#xff0c;表格的行数是手动点击按钮添加的&#xff0c;添加第一行选择select的内容能正常展示&#xff0c;添加第二行第一行的select的内容消失 代码 <FormItem label"内饰颜色"><Tableclass"mt_10&q…...

vue v-html无法解析<

vue v-html无法解析字符串的小于号 方法一&#xff1a;可以替换成转义符 (实际还是会报错) let str 12345<445667 str.replaceAll(<, <)方法二&#xff1a;可以替换成中文小于号 let str 12345<445667 str.replaceAll(<, &#xff1c;)...

COLT_CMDB_linux_userInfo_20250508.sh修复历史脚本输出指标信息中userName与输出信息不一致问题

#!/bin/bash #IT_BEGIN #IT_TYPE3 #IT SYSTEM_LINUX_AGENTUSERDISCOVER|discovery.user[disc] #原型指标 #IT_RULE SYSTEM_LINUX_AGENTUSERGROUPID|groupId[{#USERNAME}] #IT_RULE SYSTEM_LINUX_AGENTUSERHOME|userHome[{#USERNAME}] #IT_RULE SYSTEM_LINUX_AGENTUSERNAME|user…...

A. Row GCD(gcd的基本性质)

Problem - 1458A - Codeforces 思路&#xff1a; 首先得知道gcd的两个基本性质&#xff1a; (1) gcd(a,b)gcd(a,|b-a|) (2) gcd(a,b,c)gcd(a,gcd(b,c)) 结合题目所给的a1bj&#xff0c;a2bj...... anbj 根据第一条性质得到&#xff1a; gcd(a1bj&#xff0c;a2bj)gcd(…...

k8s术语之Horizontal Pod Autoscaling

应用的资源使用率通常都有高峰和低谷的时候&#xff0c;如何削峰填谷&#xff0c;提高整体的整体资源利用率&#xff0c;让service中的Pod个数自动调整呢&#xff1f;Horizontal Pod Autoscaling:使pod水平自动缩放。这个Object也是最能体现kubernetes之于传统运维价值的地方&a…...

函数级重构:如何写出高可读性的方法?

1. 引言:为什么方法级别的重构如此重要? 在软件开发中,方法(函数)是程序逻辑的基本单元。一个高质量的方法不仅决定了程序是否能正常运行,更直接影响到: 代码的可读性:能否让其他开发者快速理解可维护性:未来修改是否容易出错可测试性:是否便于编写单元测试协作效率…...

手撕基于AMQP协议的简易消息队列-8(单元测试的编写)

在MQTest中编写模块的单元测试 在MQTest中编写makefile文件来编译客户端模块 all:Test_FileHelper Test_Exchange Test_Queue Test_Binding Test_Message Test_VirtualHost Test_Route Test_Consumer Test_Channel Test_Connection Test_VirtualHost:Test_VirtualHost.cpp ..…...

硬件选型:工控机的选择要素

在机器视觉应用中&#xff0c;工控机作为核心计算设备&#xff0c;承担着图像处理、数据分析和设备控制等多重任务。由于机器视觉常常在工业自动化、质量检测和精密控制中发挥重要作用&#xff0c;工控机的选型直接影响系统的性能和可靠性。 1. 应用场景与需求 机器视觉系统广…...

【芯片设计- RTL 数字逻辑设计入门 4.1 -- verilog 组合逻辑和时序逻辑延时比较】

文章目录 Overview时间线简单示意Overview 我们来详细分析下面这段 RTL Code , sbcs_sbbusy 为什么会比 sbcs_sbbusy_nx 慢一拍(晚一个时钟周期变化)。 assign sbcs_sbbusy_nx = set_sbcs_sbbusy;always @(posedge clk or negedge dmi_resetn) beginif (!dmi_resetn) begi…...

关于ubuntu下交叉编译arrch64下的gtsam报错问题,boost中boost_regex.so中连接libicui18n.so.55报错的问题

交叉编译gtsam时遇到的报错信息如下&#xff1a;gtsam需要连接boost&#xff0c; 解决办法&#xff1a; 1.重新编译boost可解决。 2.自己搞定生成一个libicui18n.so.55。 由于我们的boost是公用的&#xff0c;因此1不太可能&#xff08;我试过重新编译完boost,在编译gtsam完…...

IoT平台和AIoT平台的区别

1. 什么是AIoT平台&#xff1f; AIoT&#xff08;人工智能物联网&#xff0c;Artificial Intelligence of Things&#xff09;平台 是 人工智能&#xff08;AI&#xff09; 与 物联网&#xff08;IoT&#xff09; 深度融合的技术框架&#xff0c;通过将AI算法嵌入物联网终端或…...

iOS 模块化开发流程

iOS模块化开发是一种将大型项目拆分为独立、可复用模块的开发模式&#xff0c;能够提升代码可维护性、团队协作效率和动态交付能力。以下是iOS模块化开发的核心流程与关键要点&#xff1a; 一、模块化设计阶段 业务解耦与模块划分 横向分层&#xff1a;基础层&#xff08;网络、…...

云原生安全治理体系建设全解:挑战、框架与落地路径

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:云原生环境下,安全治理正在被重构 在传统IT架构中,安全防护多依赖边界设备(如防火墙、WAF、堡垒机)进行集中式防护。然而,在云原生环境下,这种“边界式”安全模型正面临颠覆。 应用微服务化…...

如何在Vue-Cli中使用Element-UI和Echarts和swiper插件(低版本)

1st.Element-UI 1.1 安装 在终端输入 npm install element-ui 1.2 导入 在全局main.js中全局导入Element-UI&#xff1a; // 导入element-ui组件库 import ElementUI from element-ui; // 导入element-ui组件库的样式 import element-ui/lib/theme-chalk/index.css; // 注…...

[特殊字符]【实战教程】用大模型LLM查询Neo4j图数据库(附完整代码)

&#x1f31f; 核心要点速览 ✅ 基于LangChain框架实现LLM查询Neo4j ✅ 使用Qwen2.5模型(实测Llama3.1查不出内容) ✅ 包含完整数据准备代码实现效果演示 ✅ GitHub/Gitee源码已同步(文末获取) &#x1f6e0;️ 环境准备 1️⃣ 安装Neo4j图数据库 # Windows安装指南参考&…...

Qt获取CPU使用率及内存占用大小

Qt 获取 CPU 使用率及内存占用大小 文章目录 Qt 获取 CPU 使用率及内存占用大小一、简介二、关键函数2.1 获取当前运行程序pid2.2 通过pid获取运行时间2.3 通过pid获取内存大小 三、具体实现五、写在最后 ​ 一、简介 近期在使用软件的过程中发现一个有意思的东西。如下所示&a…...

算法解密:除自身以外数组的乘积问题详解

算法解密:除自身以外数组的乘积问题详解 一、引言 在算法的奇妙旅程中,我们时常会遇到一些看似简单却蕴含深刻智慧的问题,“除自身以外数组的乘积”就是其中之一。这个问题不仅考验我们对数组操作的熟练程度,还要求我们在特定的限制条件下(不能使用除法且时间复杂度为O(n…...

基于Kubernetes的Apache Pulsar云原生架构解析与集群部署指南(上)

#作者&#xff1a;闫乾苓 文章目录 概念和架构概述主要特点消息传递核心概念Pulsar 的消息模型Pulsar 的消息存储与分发Pulsar 的高级特性架构BrokerBookKeeperZooKeeper 概念和架构 概述 Pulsar 是一个多租户、高性能的服务器到服务器消息传递解决方案。Pulsar 最初由雅虎开…...

信创生态核心技术栈:数据库与中间件

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…...

CMU-15445(3)——PROJECT#1-BufferPoolManager-Task#1

PROJECT#1-BufferPoolManager 在完成了前面基础的PROJECT#0后&#xff0c;从本节开始才正式进入了CMU-15445的学习&#xff0c;最终目的是构建一个面向磁盘的数据库管理系统。 PROJECT#1 的主要任务是实现数据库管理系统的缓冲池管理器&#xff0c;缓冲池负责在主存缓冲区与持…...

《数据结构初阶》【链式二叉树】

《数据结构初阶》【链式二叉树】 前言&#xff1a;---------------树---------------什么是树&#xff1f;&#x1f4cc;爱心❤小贴士&#xff1a;树与非树&#xff1f;树的基本术语有哪些&#xff1f;关于节点的一些定义&#xff1a;关于树的一些定义&#xff1a;关于森林的定…...

Oracle免费认证来袭

1、Oracle Cloud Infrastructure 2025 Foundations Associate” &#x1f517; 考证地址&#xff1a;https://mylearn.oracle.com/ou/exam-unproctored/oracle-cloud-infrastructure-2025-foundations-associate-1z0-1085-25/148056/241954 2、Oracle Cloud Infrastructure 2…...

Vim 编辑器常用快捷键速查表

Vim 编辑器常用快捷键速查表 Vim 快捷键大全 **1. 基础操作****2. 光标移动****3. 编辑文本****4. 查找替换****5. 分屏操作****6. 可视化模式** **附&#xff1a;Vim 模式切换流程图** 1. 基础操作 快捷键功能说明i进入插入模式&#xff08;光标前&#xff09;a进入插入模式&…...

从父类到子类:C++ 继承的奇妙旅程(1)

前言&#xff1a; 在前文&#xff0c;小编讲述了C模板的进阶内容&#xff0c;下面我们就要结束C初阶的旅行&#xff0c;开始进入C进阶容的旅c程&#xff0c;今天旅程的第一站就是C三大特性之一——继承的旅程&#xff0c;各位扶好扶手&#xff0c;开始我们今天的C继承的奇妙旅程…...

HTML9:页面结构分析

页面结构分析 元素名描述header标题头部区域的内容&#xff08;用于页面或页面中的一块区域&#xff09;footer标记脚部区域的内容&#xff08;用于整个页面或页面的一块区域&#xff09;sectionWeb页面的一块独立区域article独立的文章内容aside相关的内容或应用&#xff08;…...

LabVIEW超声波液位计检定

在工业生产、运输和存储等环节&#xff0c;液位计的应用十分广泛&#xff0c;其中超声波液位计作为非接触式液位测量设备备受青睐。然而&#xff0c;传统立式水槽式液位计检定装置存在受建筑高度影响、量程范围受限、流程耗时长等问题&#xff0c;无法满足大量程超声波液位计的…...

maven 安装 本地 jar

命令&#xff1a; mvn install:install-file -DgroupIdnet.pingfang.application -DartifactIdjna -Dversion5.1.0 -Dpackagingjar -DfileD:\maven\repository1\jna\5.1.0\jna-5.1.0.jarmvn&#xff1a;这是Maven的执行命令。 install:install-file&#xff1a;这是Maven插件目…...

leetcode 141. Linked List Cycle

题目描述&#xff1a; 代码&#xff1a; 用哈希表也可以解决&#xff0c;但真正考察的是用快慢指针法。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Soluti…...

【Python】通过`Editable Install`模式详解,解决Python开发总是import出错的问题

摘要 田辛老师在很久以前&#xff0c;写过一篇关于Python的模块、包之间的内部关系的博客&#xff0c;叫做【Python】__init__.py 文件详解。 虽然我觉得这篇文章已经足够了&#xff0c; 但是还是有很多朋友碰到开发的过程中import包报错的问题。 今天&#xff0c; 田辛老师想…...

C 语言网络编程问题:E1696 无法打开 源 文件 “sys/socket.h“

#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>在 C 语言网络编程中&#xff0c;上述代码报如下错误 E1696 无法打开 源 文件 "sys/socket.h"E1696 无法打开 源 文件 "netinet/in.h" E1696 无法打开 源 文件…...

操作指南*

任务1: 环境搭建 1.1 创建Spring Boot项目 操作步骤&#xff1a; 使用IDEA创建项目&#xff1a; 打开IDEA → File → New → Project选择 Spring Initializr → 设置项目信息&#xff08;Group、Artifact、Java版本&#xff09;选择依赖&#xff1a;Spring Web、MySQL Drive…...

VRM Add-on for Blender 学习笔记

VRM Add-on for Blender 使用教程-CSDN博客 VRM Add-on for Blender 是 Blender 的一个官方插件&#xff0c;主要用于 导入和导出 VRM 格式的 3D 模型。VRM&#xff08;Virtual Reality Model&#xff09;是一种开放标准的 3D 人形角色模型格式&#xff0c;起源于日本&#xf…...

C++ 完美转发

C 完美转发逐步详解 1. 问题背景与核心目标 在 C 模板编程中&#xff0c;若直接将参数传递给其他函数&#xff0c;参数的 值类别&#xff08;左值/右值&#xff09;和 类型信息&#xff08;如 const&#xff09;可能会丢失。例如&#xff1a; template<typename T> voi…...

学习记录:DAY23

项目开发与学习记录&#xff1a;字段注入优化 前言 我总有一种什么大的要来了的危机感。还是尽快把项目做起来吧&#xff0c;现在全在弄底层的框架。这是一个两天的blog&#xff0c;前一天bug没修好&#xff0c;气到连blog都没写。 日程 5月7日 晚上7点&#xff1a;本来想玩…...

Linux 信号(下篇)

Linux 信号-CSDN博客&#xff08;上篇&#xff09; 前言&#xff1a;在我上一篇博客写到了信号产生的三种条件分别是键盘组合键、kill命令、系统调用接口&#xff1b; 接下来我要把信号产生剩余的两个条件介绍完毕并理解信号的保存&#xff0c;和信号从产生到保存到处理整个过…...

hadoop中的序列化和反序列化(1)

1. 什么是序列化和反序列化 序列化&#xff08;Serialization&#xff09; 是将对象的状态信息转换为可以存储或传输的格式的过程。序列化后的对象可以保存到文件中&#xff0c;或者通过网络传输。 反序列化&#xff08;Deserialization&#xff09; 是序列化的逆过程&#x…...

linux查java进程CPU高的原因

问题&#xff1a;linux查java进程CPU高的原因 解决&#xff1a;用jdk带的工具分析 被查的java最好也使用jdk启动 systemctl启动的注意要去掉PrivateTmptrue /opt/jdk1.8.0_441/bin/jps -l top -Hp 8156 printf "%x" 8533 /opt/jdk1.8.0_441/bin/jstack 8156 |…...