【每日十题系列】前端面试高频题目
以下是作为前端面试官常用的10道手撕代码题目,涵盖JavaScript核心、CSS、算法及框架原理,结合高频考点与实际开发场景设计:
1. 手写防抖(debounce)与节流(throttle)
要求:实现防抖函数(延迟执行)和节流函数(固定频率执行),并说明应用场景(如搜索框输入、窗口resize事件)。
1.防抖节流
2. 数组去重的多种实现
要求:用至少3种方法实现(如Set
、filter+indexOf
、reduce
),并分析时间复杂度的差异。
3. 深拷贝与浅拷贝的实现
要求:手写深拷贝函数,处理循环引用、函数、Symbol等特殊类型,对比JSON.parse(JSON.stringify())
的局限性。
前端中常用的数据类型判断方法各有其适用场景和局限性,以下是四种主要方式及其分析:
浅拷贝与深拷贝
深拷贝
1. typeof
作用与示例
• 原理:返回变量类型的字符串表示,适用于基本数据类型判断。
console.log(typeof 1); // 'number'
console.log(typeof 'str'); // 'string'
console.log(typeof undefined); // 'undefined'
• 局限性:
• 无法区分引用类型:数组、对象、null
均返回 'object'
。
• 函数类型特殊处理:typeof function(){}
返回 'function'
,但函数本质仍是对象。
2. instanceof
作用与示例
• 原理:通过原型链检查对象是否为某个构造函数的实例,适合判断引用类型。
console.log([] instanceof Array); // true
console.log({} instanceof Object); // true
console.log(new Number(1) instanceof Number); // true
• 局限性:
• 无法判断基本类型字面量:1 instanceof Number
返回 false
。
• 跨窗口失效:不同全局环境(如iframe)的实例可能误判。
• 原型链干扰:所有引用类型(如数组)的原型链最终指向 Object
,导致 [] instanceof Object
返回 true
。
3. constructor
作用与示例
• 原理:通过对象的 constructor
属性获取其构造函数。
console.log([].constructor === Array); // true
console.log('str'.constructor === String); // true
• 局限性:
• 易被修改:若重写对象的 prototype
,constructor
可能丢失或指向错误。
• 无法处理 null
和 undefined
:这两个值没有 constructor
属性。
4. Object.prototype.toString.call()
作用与示例
• 原理:调用对象内部的 [[Class]]
标识,返回格式如 [object Type]
的标准字符串。
console.log(Object.prototype.toString.call([])); // '[object Array]'
console.log(Object.prototype.toString.call(null)); // '[object Null]'
• 优势:
• 全面性:支持所有数据类型,包括 null
、undefined
和 ES6 新增类型(如 Symbol
)。
• 局限性:
• 无法判断继承关系:如无法区分自定义类实例的具体父类。
总结与建议
- 基本类型:优先使用
typeof
,但需注意null
的误判问题。 - 引用类型:
• 若需判断具体类型(如数组),结合Array.isArray()
或Object.prototype.toString.call()
。
• 避免依赖instanceof
判断跨环境对象。 - 高精度场景:统一使用
Object.prototype.toString.call()
,通过字符串截取获取类型标识(如slice(8, -1)
)。
例如,实现一个通用类型判断函数:
function getType(val) {if (val === null) return 'null';const type = typeof val;if (type !== 'object') return type; // 基本类型直接返回return Object.prototype.toString.call(val).slice(8, -1).toLowerCase();
}
console.log(getType([])); // 'array'
console.log(getType(Symbol())); // 'symbol'
4. Promise并发控制
要求:实现一个函数limitRequest(urls, max)
,限制同时最多处理max
个请求,按顺序返回结果(考察异步控制与队列管理)。
如何应对页面请求接口的大规模并发问题
手写Promise
class Promise {static resolve(value) {if (value instanceof Promise) {return value;}return new Promise((resolve) => {resolve(value);});}static reject(reason) {return new Promise((_, reject) => {reject(reason);});}static race(promises) {return new Promise((resolve, reject) => {promises.forEach((promise) => {Promise.resolve(promise).then(resolve, reject);});});}static all(promises) {return new Promise((resolve, reject) => {const results = [];let completedCount = 0;if (promises.length === 0) {resolve(results);return;}promises.forEach((promise, index) => {Promise.resolve(promise).then((value) => {results[index] = value;completedCount++;if (completedCount === promises.length) {resolve(results);}},(reason) => {reject(reason);});});});}constructor(executor) {// 状态this.status = "pending";// 成功结果this.value = undefined;// 失败原因this.reason = undefined;// 成功回调函数队列this.onResolvedCallbacks = [];// 失败回调函数队列this.onRejectedCallbacks = [];let resolve = (value) => {if (this.status === "pending") {// 新的值需要是 Promise,则递归解析if (value instanceof Promise) {return value.then(resolve, reject);}this.status = "fulfilled";this.value = value;// 异步执行所有成功回调this.onResolvedCallbacks.forEach((fn) => fn());}};let reject = (reason) => {if (this.status === "pending") {this.status = "rejected";this.reason = reason;// 异步执行所有失败回调this.onRejectedCallbacks.forEach((fn) => fn());}};// 执行器本身错误,直接 rejecttry {executor(resolve, reject);} catch (error) {reject(error);}}then(onFulfilled, onRejected) {onFulfilled = typeof onFulfilled === "function" ? onFulfilled : (value) => value;onRejected = typeof onRejected === "function" ? onRejected : (reason) => {throw reason;};let context = this;return new Promise((resolve, reject) => {function handleOnFulfilled() {try {const result = onFulfilled(context.value);if (result instanceof Promise) {result.then(resolve, reject);} else {resolve(result);}} catch (error) {reject(error);}}function handleOnRejected() {try {const result = onRejected(context.reason);if (result instanceof Promise) {result.then(resolve, reject);} else {resolve(result);}} catch (error) {reject(error);}}if (this.status === "fulfilled") {setTimeout(() => {handleOnFulfilled();}, 0);}if (this.status === "rejected") {setTimeout(() => {handleOnRejected();}, 0);}// 当状态为 pending 时if (this.status === "pending") {// onFulfilled 传入到成功数组this.onResolvedCallbacks.push(handleOnFulfilled);// onRejected 传入到失败数组this.onRejectedCallbacks.push(handleOnRejected);}});}catch(onRejected) {return this.then(null, onRejected);}finally(onFinally) {return this.then((value) => Promise.resolve(onFinally()).then(() => value),(reason) => Promise.resolve(onFinally()).then(() => {throw reason;}));}
}// // 示例用法
// const promise1 = new Promise((resolve) => setTimeout(() => resolve('one'), 1000));
// const promise2 = new Promise((resolve) => setTimeout(() => resolve('two'), 2000));
//
// // 使用 Promise.race
// Promise.race([promise1, promise2]).then((value) => {
// console.log('Promise.race result:', value); // 输出: Promise.race result: one
// });
//
// // 使用 Promise.all
// Promise.all([promise1, promise2]).then((values) => {
// console.log('Promise.all result:', values); // 输出: Promise.all result: [ 'one', 'two' ]
// });
//
// // 生成多个测试 Promise
// function generatePromises(count) {
// const promises = [];
// for (let i = 0; i < count; i++) {
// const delay = Math.random() * 1000; // 随机延迟 0 - 1000ms
// promises.push(new Promise((resolve) => {
// setTimeout(() => {
// resolve(i);
// }, delay);
// }));
// }
// return promises;
// }
// // 测试 Promise.race
// function testPromiseRace(count) {
// const promises = generatePromises(count);
// const startTime = performance.now();
// Promise.race(promises).then(() => {
// const endTime = performance.now();
// console.log(`Promise.race with ${count} promises took ${endTime - startTime} ms`);
// });
// }
//
// // 测试 Promise.all
// function testPromiseAll(count) {
// const promises = generatePromises(count);
// const startTime = performance.now();
// Promise.all(promises).then(() => {
// const endTime = performance.now();
// console.log(`Promise.all with ${count} promises took ${endTime - startTime} ms`);
// });
// }
//
// // 测试不同数量的 Promise
// const testCounts = [10, 100, 1000];
// testCounts.forEach((count) => {
// testPromiseRace(count);
// testPromiseAll(count);
// });
5. CSS实现三角形与垂直居中
要求:
• 用CSS画一个三角形(利用border
透明属性);
• 用Flex布局实现元素垂直居中(至少两种方式)。
#triangle {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid red;border-top: 100px solid red;/*border: 20px solid transparent;*//*border-top-color: red;*//*border-bottom-color: red;*/}
Grid布局回顾
6. 括号匹配算法
要求:编写函数判断字符串中的括号是否有效(如"({[]})"
有效,"([)]"
无效),使用栈结构实现。
7. 函数柯里化(Currying)
要求:实现一个通用柯里化函数,支持curry(add)(1)(2)(3)
调用形式,其中add
接收多个参数求和。
8. 数组扁平化(Flatten)
要求:将多维数组展开为一维数组(如[1, [2, [3]]]
转为[1,2,3]
),用递归、reduce
或ES6的flat
方法实现。
9. React/Vue的虚拟DOM对比
要求:手写一个简化版虚拟DOM的Diff算法,比较两棵树的不同并输出差异(考察节点复用与Key的作用)。
10. 实现一个简易的EventEmitter
要求:实现事件订阅(on
)、触发(emit
)、取消订阅(off
)功能,支持异步事件队列。
考察重点
• 代码健壮性:处理边界条件(如空值、异常输入);
• 性能优化:避免不必要的计算或内存泄漏;
• 原理理解:解释实现思路与底层机制(如闭包、原型链、事件循环)。
提示:以上题目可根据候选人经验调整难度(如增加异步流程、复杂数据结构处理)。建议要求候选人现场编码,并逐步追问优化方案(如防抖节流的时间参数动态化、深拷贝的循环引用检测等)。
以下是一些常见 JavaScript 代码实现的详解,结合应用场景和实现原理进行说明:
嗯,用户让我帮忙回答10个JavaScript的手写题目,每个题目都需要详细实现和解释。首先,我得逐一看看每个问题,然后结合提供的搜索结果来整理答案。
第一个题目是防抖和节流
。搜索结果里有很多关于防抖和节流的实现,比如非立即执行和立即执行两种防抖方式。防抖的核心是延迟执行,而节流是固定频率执行。应用场景方面,搜索框输入用防抖,窗口resize可能用节流或防抖,得看具体需求。我需要写出两者的代码,并说明应用场景,注意处理闭包中的变量。
第二个是数组去重
,至少三种方法。搜索结果里提到了Set、filter+indexOf、reduce等方法。Set最简单,时间复杂度是O(n);filter+indexOf因为每次都要检查索引,可能到O(n²);reduce同样可能接近O(n²)。需要比较它们的性能差异。
第三个是深拷贝
,处理循环引用和特殊类型。JSON方法的局限性是不能处理函数和循环引用,递归实现时需要用WeakMap来跟踪已拷贝的对象,处理Date、RegExp等类型。需要对比JSON方法的缺点,并展示如何处理这些情况。
第四个是Promise并发控制
,实现limitRequest函数。搜索结果里提到了使用队列和递归,或者async/await结合Promise.race。需要维护一个执行队列,控制同时进行的请求数量,按顺序返回结果。要注意异步管理和队列的执行顺序。
第五个是CSS画三角形和垂直居中
。三角形用border的透明属性,比如设置三个边透明,另一边显示颜色。垂直居中Flex布局的话,可以用align-items和justify-content,或者用margin:auto的方式。需要给出两种Flex实现方式。
第六个括号匹配
,用栈结构。遇到左括号入栈,右括号时检查栈顶是否匹配。最后栈应该为空。需要处理各种括号类型,确保顺序正确。
第七个函数柯里化
,支持多参数调用。柯里化函数需要递归或闭包保存参数,直到参数数量足够执行原函数。比如curry(add)(1)(2)(3)需要累积参数,当参数数目满足时调用add求和。
第八个数组扁平化
,可以用递归、reduce或flat方法。递归的话遍历数组,将元素展开;reduce方法累加结果;flat方法最简单但可能有兼容性问题。需要比较不同方法的实现。
第九个虚拟DOM的Diff算法
。简化版的话,可以比较节点的类型和属性,处理子节点的差异。Key的作用是复用节点,减少DOM操作。需要手写一个简单的Diff函数,输出差异。
第十个EventEmitter
,实现on、emit、off。使用对象存储事件和回调数组,emit时触发所有回调,支持异步可能需要用Promise或setTimeout。要注意取消订阅时从数组中移除回调,避免内存泄漏。
每个问题都需要结合搜索结果中的代码示例,并解释实现原理和注意事项。比如防抖中的闭包和定时器管理,深拷贝中的循环引用处理,Promise并发中的队列控制等。同时,要引用对应的搜索结果作为参考,确保答案的准确性。
1. 防抖(Debounce)与节流(Throttle)
防抖实现
核心:延迟执行,若重复触发则重置计时器。
function debounce(func, delay) {let timeout;return function(...args) {clearTimeout(timeout);timeout = setTimeout(() => func.apply(this, args), delay);};
}
节流实现
核心:固定时间间隔执行一次。
function throttle(func, interval) {let lastTime = 0;return function(...args) {const now = Date.now();if (now - lastTime >= interval) {func.apply(this, args);lastTime = now;}};
}
应用场景
• 防抖:搜索框输入联想(延迟请求)、窗口 resize 停止后计算布局
• 节流:滚动事件触发加载、高频点击按钮防重复提交
2. 数组去重的多种实现
方法 1:Set(时间复杂度 O(n))
const unique = arr => [...new Set(arr)];
方法 2:filter + indexOf(时间复杂度 O(n²))
const unique = arr => arr.filter((item, index) => arr.indexOf(item) === index);
方法 3:reduce(时间复杂度 O(n²))
const unique = arr => arr.reduce((acc, cur) => acc.includes(cur) ? acc : [...acc, cur], []);
性能对比
• Set 最快(哈希表特性),reduce 和 filter 需遍历检查重复项,适合小规模数据
3. 深拷贝与浅拷贝
深拷贝实现(处理循环引用、特殊类型)
function deepClone(obj, hash = new WeakMap()) {if (obj === null || typeof obj !== 'object') return obj;if (obj instanceof Date) return new Date(obj);if (obj instanceof RegExp) return new RegExp(obj);if (hash.has(obj)) return hash.get(obj); // 解决循环引用const clone = new obj.constructor();hash.set(obj, clone);for (const key in obj) {if (obj.hasOwnProperty(key)) {clone[key] = deepClone(obj[key], hash);}}return clone;
}
JSON 方法的局限性
• 无法处理函数、Symbol、undefined
• 丢失原型链、无法处理循环引用
4. Promise 并发控制
实现 limitRequest(urls, max)
async function limitRequest(urls, max) {const results = [];const executing = [];for (const url of urls) {const p = fetch(url).then(res => {executing.splice(executing.indexOf(p), 1);return res;});results.push(p);executing.push(p);if (executing.length >= max) {await Promise.race(executing);}}return Promise.all(results);
}
原理
• 维护执行队列,通过 Promise.race
动态控制并发数
5. CSS 实现三角形与垂直居中
三角形(利用 border)
.triangle {width: 0;height: 0;border: 20px solid transparent;border-top-color: red;
}
Flex 垂直居中(两种方式)
- 容器设置:
.container {display: flex;justify-content: center;align-items: center;
}
- 子元素设置:
.child {margin: auto;
}
在前端开发中,实现元素的水平垂直居中是常见的布局需求。以下是几种主流方法及其适用场景,综合多个技术文档整理而来:
一、Flexbox 弹性布局(现代推荐方案)
通过设置父容器为弹性布局,可快速实现子元素居中:
.parent {display: flex;justify-content: center; /* 水平居中 */align-items: center; /* 垂直居中 */
}
该方法无需子元素固定尺寸,支持响应式布局,适用于大多数现代浏览器。
二、Grid 网格布局(高效简洁方案)
利用网格布局的place-items
属性可一键实现居中:
.parent {display: grid;place-items: center; /* 同时定义行列对齐 */
}
Grid 布局特别适合复杂布局场景,代码简洁且维护性强。
三、绝对定位 + Transform(传统兼容方案)
适用于需要脱离文档流的元素:
.child {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%); /* 自适应宽高 */
}
优势在于不依赖元素尺寸,但需要父容器设置定位上下文。
四、行内元素特殊处理
针对行内或文本元素:
- 单行文本:父元素设置相同的
line-height
与高度 - 多行内容:结合伪元素实现垂直居中:
.parent {text-align: center;
}
.parent::before {content: '';display: inline-block;height: 100%;vertical-align: middle;
}
.child {display: inline-block;vertical-align: middle;
}
这种方法适合表单控件、按钮等行内元素的对齐。
五、固定尺寸元素的经典方案
当元素尺寸已知时:
.child {width: 200px;height: 100px;position: absolute;top: 50%;left: 50%;margin-top: -50px; /* 高度的一半 */margin-left: -100px; /* 宽度的一半 */
}
或使用calc()
动态计算:
.child {top: calc(50% - 50px);left: calc(50% - 100px);
}
适合传统项目或需要精确控制尺寸的场景。
扩展建议:
• 响应式布局优先选择 Flex/Grid 方案
• 动态内容推荐使用 Transform 方案
• IE兼容需注意 Grid 布局仅支持 IE10+,Flexbox 需添加-ms-
前缀
• 容器高度未知时,Flex/Grid 仍能保持居中效果
6. 括号匹配算法(栈结构)
实现
function isValidBrackets(str) {const stack = [];const map = { '(': ')', '[': ']', '{': '}' };for (const char of str) {if (map[char]) {stack.push(char);} else if (Object.values(map).includes(char)) {if (stack.length === 0 || map[stack.pop()] !== char) return false;}}return stack.length === 0;
}
原理
• 左括号入栈,右括号匹配栈顶元素
7. 函数柯里化
通用柯里化函数
function curry(func) {return function curried(...args) {if (args.length >= func.length) {return func.apply(this, args);} else {return (...args2) => curried.apply(this, args.concat(args2));}};
}
// 示例:const add = (...nums) => nums.reduce((a, b) => a + b, 0);
调用形式
curry(add)(1)(2)(3)()
输出 6
8. 数组扁平化
方法 1:递归
function flatten(arr) {return arr.reduce((acc, cur) => acc.concat(Array.isArray(cur) ? flatten(cur) : cur), []);
}
方法 2:ES6 flat
const flatten = arr => arr.flat(Infinity);
方法 3:扩展运算符
function flatten(arr) {while (arr.some(Array.isArray)) {arr = [].concat(...arr);}return arr;
}
9. 虚拟 DOM Diff 算法(简化版)
实现差异对比
function diff(oldNode, newNode) {const patches = [];if (oldNode.type !== newNode.type) {patches.push({ type: 'REPLACE', newNode });} else if (oldNode.props !== newNode.props) {patches.push({ type: 'UPDATE_PROPS', props: newNode.props });}// 递归对比子节点(需处理 Key 优化复用)return patches;
}
Key 的作用
• 识别节点身份,减少不必要的重新渲染
10. 简易 EventEmitter
实现
class EventEmitter {constructor() {this.events = {};}on(event, callback) {(this.events[event] ||= []).push(callback);}emit(event, ...args) {(this.events[event] || []).forEach(cb => cb(...args));}off(event, callback) {this.events[event] = this.events[event]?.filter(cb => cb !== callback);}
}
异步队列支持
• 在 emit
中使用 setTimeout
或 Promise.resolve()
包裹回调
代码健壮性建议
• 防抖/节流:处理 this
绑定和参数透传
• 深拷贝:使用 WeakMap
避免内存泄漏
• Promise 并发:处理请求失败和重试机制
原理总结
• 闭包:防抖/节流、柯里化通过闭包保存状态
• 原型链:EventEmitter 基于类实现事件管理
• 异步队列:Promise 并发控制依赖事件循环调度
相关文章:
【每日十题系列】前端面试高频题目
以下是作为前端面试官常用的10道手撕代码题目,涵盖JavaScript核心、CSS、算法及框架原理,结合高频考点与实际开发场景设计: 1. 手写防抖(debounce)与节流(throttle) 要求:实现防抖函…...
Kafka 消息 0 丢失的最佳实践
文章目录 Kafka 消息 0 丢失的最佳实践生产者端的最佳实践使用带有回调的 producer.send(msg, callback) 方法设置 acks all设置 retries 为一个较大的值启用幂等性与事务(Kafka 0.11)正确关闭生产者与 flush() 方法 Broker 端的最佳实践设置 unclean.l…...
学网络安全报班可靠吗?
在当今社会,网络安全已经成为我们工作和生活中不可忽视的重要部分,而且市场上各大企业对网络安全人才的需求量非常之大,因此网络安全培训班应运而生,那么学网络安全报培训班靠谱吗?这是很多小伙伴都关心的问题,我们来…...
LeetCode 1745.分割回文串 IV:动态规划(用III或II能直接秒)
【LetMeFly】1745.分割回文串 IV:动态规划(用III或II能直接秒) 力扣题目链接:https://leetcode.cn/problems/palindrome-partitioning-iv/ 给你一个字符串 s ,如果可以将它分割成三个 非空 回文子字符串,…...
4 Redis4 List命令类型讲解
Redis 列表(List)命令详解 1. Redis 列表(List)简介 Redis 列表(List)是一个简单的字符串列表,按照插入顺序排序。它可以用作 栈(Stack) 和 队列(Queue&…...
鬼泣:项目前置设置杂项
能帮到你的话,就给个赞吧 😘 文章目录 插件niagara ui render:在 UI 中渲染 Niagara 特效skeletal editor:编辑骨骼,调整骨骼动画motion warping:根据目标自动调整角色动画。animation warping:…...
MyBatis-Plus 条件构造器的使用(左匹配查询)
在上一篇文章中,我们已经介绍了 MyBatis-Plus 条件构造器,包括 QueryWrapper 和 UpdateWrapper 的基本使用方法、常见查询条件(如等于、不等于、大于、小于)以及如何使用 Lambda 表达式来构建动态查询和更新条件。 在本文中&…...
#define GBB_DEPRECATED_MSG(msg) __declspec(deprecated(msg))
这个宏 #define GBB_DEPRECATED_MSG(msg) __declspec(deprecated(msg)) 是用来在 C++ 中标记某些函数、变量或者代码元素为已弃用(deprecated)的,并附带一个自定义的弃用消息。 具体解释: __declspec(deprecated(msg)): __declspec 是 Microsoft Visual C++ (MSVC) 的扩展…...
Vue输入框获取焦点
1. 元素未渲染完成 如果你在组件挂载或数据更新后立即调用 focus(),可能元素还未渲染到 DOM 中,导致 focus() 失效。 解决方法:确保在元素渲染完成后再调用 focus()。可以使用 nextTick 确保 DOM 更新完成。 2. ref 未正确绑定 确保 ref 正确…...
辛格迪客户案例 | 深圳善康医药科技GMP培训管理(TMS)项目
01 善康医药:创新药领域的探索者 深圳善康医药科技股份有限公司自2017年创立以来,便扎根于创新药研发领域,专注于成瘾治疗药物的研究、生产与销售。公司坐落于深圳,凭借自身独特的技术优势与研发实力,在行业内逐渐崭露…...
迷你世界脚本出生点接口:Spawnport
出生点接口:Spawnport 彼得兔 更新时间: 2023-04-26 10:19:56 具体函数名及描述如下: 序号 函数名 函数描述 1 getSpawnPoint(...) 获取默认出生点 2 setSpawnPoint(...) 设置出生点位置 3 getChunkValidSpawnPos(...) 获取区块有效刷新点…...
Android车机DIY开发之软件篇(二十)立创泰山派android编译
准备工作 sudo apt-get update sudo apt-get install git -y sudo apt install repo -ysudo apt-get install python2.7sudo apt-get install python3sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 sudo update-alternatives --install /u…...
MDM 如何彻底改变医疗设备的远程管理
在现代医疗行业迅速发展的格局中,医院和诊所越来越依赖诸如医疗平板和移动工作站等移动设备。这些设备在提高工作效率和提供卓越的患者护理方面发挥着关键作用。然而,随着它们的广泛使用,也带来了一系列挑战,例如在不同地点确保数…...
Libgdx游戏开发系列教程(6)——游戏暂停
目录 最初方案1 优化方案2 - 事件拦截器监听按键 优化方案3 - 暂停状态重绘 优化方案4 优化方案5 补充 - 监听android手机的返回键 暂停也是一个游戏的必要功能了,本文研究了Libgdx实现游戏暂停 例子以桌面端游戏实现讲解为主,至于移动端,可能之后会进行补充... 本文最…...
车载测试:智能座舱测试中多屏联动与语音交互的挑战
智能座舱作为汽车智能化发展的核心,集成了多屏联动和语音交互功能,为驾驶员和乘客提供更便捷的体验。然而,这些功能的测试面临诸多挑战,包括多屏同步性、噪声干扰和复杂场景的处理。本文将详细分析这些挑战,探讨测试方…...
【踩坑随笔】`npm list axios echarts`查看npm依赖包报错
npm list axios echarts查看npm依赖包出现以下报错,原因就是包的版本匹配问题,按照提示降axios版本或者自己升找合适的got版本,我这里是选择了降版本。本文记录仅做解决思路参考不一定适配大家的实际情况。 weed-detection-system1.0.0 E:\P…...
用于管理 Elasticsearch Serverless 项目的 AI Agent
作者:来自 Elastic Fram Souza 由自然语言驱动的 AI 代理,可轻松管理 Elasticsearch Serverless 项目 - 支持项目创建、删除和状态检查。 这个小型命令行工具让你可以用简单的英语管理你的无服务器 Elasticsearch 项目。它通过AI(这里是 Ope…...
【文生图】windows 部署stable-diffusion-webui
windows 部署stable-diffusion-webui AUTOMATIC1111 stable-diffusion-webui Detailed feature showcase with images: 带图片的详细功能展示: Original txt2img and img2img modes 原始的 txt2img 和 img2img 模式 One click install and run script (but you still must i…...
STaR(Self-Taught Reasoner)方法:让语言模型自学推理能力(代码实现)
STaR(Self-Taught Reasoner)方法:让语言模型自学推理能力 在大型语言模型(LLM)的推理能力优化中,STaR(Self-Taught Reasoner) 是一种引人注目的技术,属于“修改提议分布…...
十大经典排序算法简介
一 概述 本文对十大经典排序算法做简要的总结(按常用分类方式排列),包含核心思想、时间/空间复杂度及特点。 二、比较类排序 1. 冒泡排序 (BUBBLE SORT) 思想:重复交换相邻逆序元素,像气泡上浮 复杂度: 时间:O(n^2)(最好情况O(n)) 空间:O(1) 特点:简单但效率低,稳…...
5.训练策略:优化深度学习训练过程的实践指南——大模型开发深度学习理论基础
在实际开发中,训练策略对神经网络的表现起着至关重要的作用。通过合理的训练策略,我们可以有效避免过拟合和欠拟合,加速模型收敛,并提升最终性能。本文将从实际开发角度详细介绍几种关键的训练策略,包括 Early Stoppin…...
道可云人工智能每日资讯|《奇遇三星堆》VR沉浸探索展(淮安站)开展
道可云元宇宙每日简报(2025年3月5日)讯,今日元宇宙新鲜事有: 《奇遇三星堆》VR沉浸探索展(淮安站)开展 近日,《奇遇三星堆》VR沉浸探索展(淮安站)开展。该展将三星堆文…...
Camera相关配置
一、 Purpose目的 通常, 感知模块使用雷达点云和相机图像来对物体进行检测和分类,感知数据分别来自雷达和相机,就传感器数据融合准确性,我们需要雷达和相机同一时间捕捉到同一物体(时间间隔尽可能短),否则一个真实的物…...
PHP Error处理指南
PHP Error处理指南 引言 在PHP开发过程中,错误处理是一个至关重要的环节。正确的错误处理不仅能够提高代码的健壮性,还能提升用户体验。本文将详细介绍PHP中常见的错误类型、错误处理机制以及最佳实践,帮助开发者更好地应对和处理PHP错误。 PHP错误类型 在PHP中,错误主…...
【Pandas】pandas Series argmax
Pandas2.2 Series Computations descriptive stats 方法描述Series.argsort([axis, kind, order, stable])用于返回 Series 中元素排序后的索引位置的方法Series.argmin([axis, skipna])用于返回 Series 中最小值索引位置的方法Series.argmax([axis, skipna])用于返回 Series…...
Gitlab配置personal access token
1.点击左上角个人账号 -> Preferences 2. 点击左边栏 Access Tokens 3. 点击Add new token ,输入token名称,勾选权限(注意截至日期 “Expiration date” 可不填) 4. 创建成功后,显示token信息,复制到本地…...
【MySQL、Oracle、SQLserver、postgresql】查询多条数据合并成一行
四大数据库多行合并为单行:函数详解与对比 一、MySQL**GROUP_CONCAT()** 函数说明:语法结构:参数解释:示例:注意事项: 二、Oracle**LISTAGG()** 函数说明:语法结构:参数解释…...
人机交互进化论:解码智能手机81种交互方式背后的用户体验革命
人机交互进化论:解码智能手机81种交互方式背后的用户体验革命 2023年艾瑞咨询报告显示:中国智能手机用户日均触屏交互超2500次,解锁屏幕达76次/天。在这看似简单的点击与滑动背后,隐藏着一场持续演进的人机交互革命。本文将深度解…...
OCPP扩展机制与自定义功能开发:协议灵活性设计与实践 - 慧知开源充电桩平台
OCPP扩展机制与自定义功能开发:协议灵活性设计与实践 引言 OCPP作为开放协议,其核心价值在于平衡标准化与可扩展性。面对不同充电桩厂商的硬件差异、区域能源政策及定制化业务需求,OCPP通过**扩展点(Extension Points)…...
网络编程之TCP协议
传输层协议:UDP和TCP的区别 UDP:用户数据报协议 1.面向数据报 2.无连接 3.不安全,不可靠(尽最大努力交付) TCP:传输控制协议 1.面向数据流(流式套接字) 2.建立连接 3.安全可靠的传输协议 TCP的传输过程 三次握手:TCP建立…...
策略模式的C++实现示例
核心思想 策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在独立的类中,使得它们可以互相替换。策略模式让算法的变化独立于使用它的客户端,从而使得客户端可以根据需要动态切换算法,而不需要修改…...
keil软件下载安装使用(STM32篇)
一、前言 Keil软件是一款专为嵌入式系统开发设计的集成开发环境(IDE),由德国Keil公司创立,后被ARM公司收购并持续更新维护。它集成了代码编辑、编译、调试和项目管理等功能,广泛应用于各类单片机的程序开发࿰…...
【简单的C++围棋游戏开发示例】
C围棋游戏开发简单示例(控制台版) 核心代码实现 #include <iostream> #include <vector> #include <queue> using namespace std;const int SIZE 9; // 简化棋盘为9x9:ml-citation{ref"1" data"citationList&…...
【Python 数据结构 4.单向链表】
目录 一、单向链表的基本概念 1.单向链表的概念 2.单向链表的元素插入 元素插入的步骤 3.单向链表的元素删除 元素删除的步骤 4.单向链表的元素查找 元素查找的步骤 5.单向链表的元素索引 元素索引的步骤 6.单向链表的元素修改 元素修改的步骤 二、Python中的单向链表 编辑 三…...
组合逻辑和时序逻辑
组合逻辑 定义 组合逻辑电路是一种输出只取决于当前输入值的电路,即电路的输出状态仅由当前时刻的输入信号组合决定,与电路过去的状态无关。 特点 无记忆功能:组合逻辑电路不具备存储信息的能力,它不会记住之前的输入情况。每次…...
如何有效判断与排查Java GC问题
目录 一、GC的重要性与对性能的影响 (一)GC对性能的影响简要分析 1.GC暂停与应用停顿 2.GC吞吐量与资源利用率 3.GC对内存管理的作用:资源回收 4.GC策略与优化的选择 (二)GC的双刃剑 二、GC性能评价标准 &…...
Ubuntu20.04 在离线机器上安装 NVIDIA Container Toolkit
步骤 1.下载4个安装包 Index of /nvidia-docker/libnvidia-container/stable/ nvidia-container-toolkit-base_1.13.5-1_amd64.deb libnvidia-container1_1.13.5-1_amd64.deb libnvidia-container-tools_1.13.5-1_amd64.deb nvidia-container-toolkit_1.13.5-1_amd64.deb 步…...
【流行病学】Melodi-Presto因果关联工具
title: “[流行病学] Melodi Presto因果关联工具” date: 2022-12-08 lastmod: 2022-12-08 draft: false tags: [“流行病学”,“因果关联工具”] toc: true autoCollapseToc: true 阅读介绍 Melodi-Presto: A fast and agile tool to explore semantic triples derived from …...
Android14 OTA差分包升级报Package is for source build
制作好差分包,使用adb线刷模式验证ota升级,出现E:Package is for source build错误 使用adb方式验证 进入recovery模式 adb reboot recovery稍等一会界面会提示 Now send the package you want to apply to the device with "adb sidelaod <…...
PTA L2一些题目
L2-014 列车调度 - 团体程序设计天梯赛-练习集 样例是怎么来的呢?通过题目我们知道每一条轨道的车牌号必须是依次递减的。那么,我们如果让每条轨道尽可能长就能保证轨道数最少------也就是说,我们要尽可能的找最长降序序列。 但是1e5数据量…...
Harbor端口更改||Harbor端口映射
Harbor端口更改|Harbor端口映射 目标:将端口更改为8930 前言 [rootk8s-node1 harbor]# ls common common.sh docker-compose.yml harbor.v2.5.0.tar.gz harbor.yml harbor.yml.tmpl install.sh LICENSE prepare如上是Harbor的文件目录 更改harbor.yml文件…...
基于STM32的智能家居蓝牙系统(论文+源码)
1总体方案设计 本次基于STM32的智能家居蓝牙系统,其系统总体架构如图2.1所示,采用STM32f103单片机作为控制器,通过DHT11传感器实现温湿度检测,MQ-2烟雾传感器实现烟雾检测,光敏电阻实现光照检测,同时将数据…...
视觉Transformer(DETR)
文章目录 DETR总体流程DETR 中 transformer 结构encoderdecoderObeject Query HEADFFNLOSS正负样本分配 简单的demo不足之处 DETR 是首次将 Transformer结构首次应用到视觉 目标检测中,实现 端到端的目标检测。 传统目标检测路线(yolo代表)…...
Linux下学【MySQL】中如何实现:多表查询(配sql+实操图+案例巩固 通俗易懂版~)
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: 本章是MySQL篇中,非常实用性的篇章,相信在实际工作中对于表的查询,很多时候会涉及多表的查询,在多表查询…...
【Office-Word】如何自动生成中英文目录
1.目录介绍 Word这个自动生成目录非常强大,涉及的功能很琐碎,想要完美的生成目录不仅仅是只会目录这么简单,前后涉及到的大纲级别、目标样式和域代码等操作是比较头疼的。 下面就一步一步开始介绍 2.多级标题级别编号设置 目录想要设置好…...
低代码平台的后端架构设计与核心技术解析
引言:低代码如何颠覆传统后端开发? 在传统开发模式下,一个简单用户管理系统的后端开发需要: 3天数据库设计5天REST API开发2天权限模块对接50个易出错的代码文件 而现代低代码平台通过可视化建模自动化生成,可将开发…...
【微信小程序】每日心情笔记
个人团队的比赛项目,仅供学习交流使用 一、项目基本介绍 1. 项目简介 一款基于微信小程序的轻量化笔记工具,旨在帮助用户通过记录每日心情和事件,更好地管理情绪和生活。用户可以根据日期和心情分类(如开心、平静、难过等&#…...
【leetcode hot 100 73】矩阵置零
解法一:(使用两个标记变量)用矩阵的第一行和第一列代替方法一中的两个标记数组(col、row[ ]:第几列、行出现0),以达到 O(1) 的额外空间。 这样会导致原数组的第一行和第一列被修改,…...
【Linux】自定协议和序列化与反序列化
目录 一、序列化与反序列化概念 二、自定协议实现一个加法网络计算器 (一)TCP如何保证接收方的接收到数据是完整性呢? (二)自定义协议 (三)自定义协议的实现 1、基础类 2、序列化与反序列…...
混合专家模型(MoE):高效处理复杂任务的智能架构,DeepSeek性能出色的秘诀
混合专家模型 1. 什么是混合专家模型 混合专家模型(Mixture of Experts,简称 MoE) 是一种先进的神经网络架构,旨在通过整合多个 专门化的子模型(或称为“专家”) 的预测来提升整体模型性能。其核心思想是…...