JavaScript数学计算实战:用Math对象解决5个常见问题(附educoder通关代码)
JavaScript数学与日期实战从基础到精通的5个核心场景最近在辅导一些刚接触JavaScript的朋友时我发现一个挺有意思的现象很多人对Math和Date这两个内置对象有种“既熟悉又陌生”的感觉。说熟悉是因为几乎每个教程都会提到它们说陌生是当真正需要在项目中解决具体问题时却常常卡在一些细节上——比如四舍五入到底该用哪个方法或者日期计算时那个恼人的月份从0开始的问题。这篇文章我想换个角度不按传统的API罗列方式来讲而是围绕5个你在实际开发中几乎一定会遇到的场景拆解Math和Date对象的实战用法。我会结合educoder这类实训平台常见的题目类型但更侧重于分享我在真实项目中踩过的坑和总结出的技巧。无论你是正在学习前端的新手还是需要快速查阅某个具体问题的开发者相信这些内容都能给你带来直接的帮助。1. 数值处理超越简单的四舍五入当我们提到JavaScript中的数值计算很多人第一反应就是“精度问题”。这确实是个痛点但在解决精度问题之前我们得先搞清楚基础的四舍五入到底有多少种玩法。Math对象提供了三个看似相似但行为迥异的方法round()、floor()和ceil()。先看一个educoder上常见的题目变形给定一个数值需要同时计算它的向上取整、向下取整、四舍五入然后比较这些结果。新手最容易犯的错误是直接比较却忽略了这些方法返回值的类型和特性。function compareRoundingMethods(num) { const ceilResult Math.ceil(num); // 向上取整 const floorResult Math.floor(num); // 向下取整 const roundResult Math.round(num); // 四舍五入 // 比较逻辑示例 const results { ceil: ceilResult, floor: floorResult, round: roundResult, isCeilGreatest: ceilResult floorResult ceilResult roundResult, isFloorSmallest: floorResult ceilResult floorResult roundResult }; return results; } // 测试几个边界值 console.log(compareRoundingMethods(3.14)); console.log(compareRoundingMethods(-3.14)); console.log(compareRoundingMethods(3.5));注意Math.round()在处理.5时采用的是“银行家舍入法”四舍六入五成双但在大多数JavaScript实现中它实际上就是四舍五入。不过要特别注意负数的四舍五入Math.round(-3.5)返回的是-3而不是-4。但实际项目中我们很少只做简单的整数转换。更常见的是需要保留指定小数位。这时候很多人会想到toFixed()但这个方法返回的是字符串而且存在著名的精度问题// 常见的错误做法 const num 1.005; const rounded num.toFixed(2); // 返回1.00而不是期望的1.01 // 更可靠的做法 function roundToDecimal(value, decimals) { const factor Math.pow(10, decimals); return Math.round((value Number.EPSILON) * factor) / factor; } console.log(roundToDecimal(1.005, 2)); // 1.01 console.log(roundToDecimal(1.235, 2)); // 1.24这里引入的Number.EPSILON是ES6新增的极小常量用来解决浮点数精度问题。虽然不能完全消除浮点数误差但在大多数场景下足够用了。2. 三角函数与几何计算的实际应用三角函数在Web开发中的应用远比想象中广泛。从简单的角度计算到复杂的动画效果Math.sin()、Math.cos()、Math.tan()这些方法其实很有用。但很多人在educoder上做相关题目时容易忽略一个关键点JavaScript的三角函数接受的是弧度值而不是角度。先看一个常见的转换函数// 角度与弧度转换 function degreesToRadians(degrees) { return degrees * (Math.PI / 180); } function radiansToDegrees(radians) { return radians * (180 / Math.PI); } // 实际应用计算两点之间的角度 function calculateAngle(x1, y1, x2, y2) { const deltaX x2 - x1; const deltaY y2 - y1; // 使用Math.atan2计算角度返回弧度 const radians Math.atan2(deltaY, deltaX); // 转换为角度并确保在0-360度之间 let degrees radiansToDegrees(radians); if (degrees 0) { degrees 360; } return degrees; }提示Math.atan2(y, x)比Math.atan(y/x)更可靠因为它正确处理了所有象限和除零的情况。在数据可视化或游戏开发中圆周运动是个经典场景。假设我们要让一个元素围绕某个中心点做圆周运动class CircularMotion { constructor(centerX, centerY, radius, speed) { this.centerX centerX; this.centerY centerY; this.radius radius; this.speed speed; // 弧度/毫秒 this.angle 0; this.lastTime Date.now(); } update() { const currentTime Date.now(); const deltaTime currentTime - this.lastTime; this.lastTime currentTime; // 更新角度 this.angle this.speed * deltaTime; // 计算新位置 const x this.centerX Math.cos(this.angle) * this.radius; const y this.centerY Math.sin(this.angle) * this.radius; return { x, y }; } } // 使用示例 const motion new CircularMotion(400, 300, 100, 0.001); setInterval(() { const position motion.update(); console.log(当前位置: (${position.x.toFixed(2)}, ${position.y.toFixed(2)})); }, 16); // 约60fps这个例子展示了三角函数在动画中的应用同时也引出了时间计算——这自然过渡到我们的下一个主题。3. 日期处理从基础操作到复杂业务逻辑日期处理是Web开发中的高频需求也是educoder等平台的重点考察内容。Date对象看似简单但实际用起来坑不少。我们先从最基本的创建和格式化开始。3.1 日期的创建与解析创建日期对象有多种方式每种都有其适用场景// 1. 当前时间 const now new Date(); // 2. 指定时间戳毫秒 const timestamp 1672531199000; // 2023-01-01 00:00:00 const dateFromTimestamp new Date(timestamp); // 3. 日期字符串注意浏览器兼容性 const dateFromString new Date(2023-12-31T23:59:59); // 4. 指定年月日时分秒 const specificDate new Date(2023, 11, 31, 23, 59, 59); // 注意月份从0开始 // 5. Date.UTC() 创建UTC时间 const utcDate new Date(Date.UTC(2023, 11, 31, 23, 59, 59));这里特别要注意的是月份从0开始这个经典陷阱。new Date(2023, 11, 31)创建的是12月31日而不是11月31日。我在项目中见过不止一次因为这个bug导致的线上问题。3.2 日期计算与比较实际业务中我们经常需要进行日期计算。下面这个工具类封装了常见的日期操作class DateCalculator { // 计算两个日期之间的天数差 static daysBetween(date1, date2) { const msPerDay 24 * 60 * 60 * 1000; const time1 date1.getTime(); const time2 date2.getTime(); return Math.round(Math.abs(time2 - time1) / msPerDay); } // 添加天数 static addDays(date, days) { const result new Date(date); result.setDate(result.getDate() days); return result; } // 获取当月第一天 static getFirstDayOfMonth(date) { return new Date(date.getFullYear(), date.getMonth(), 1); } // 获取当月最后一天 static getLastDayOfMonth(date) { return new Date(date.getFullYear(), date.getMonth() 1, 0); } // 判断是否为闰年 static isLeapYear(year) { return (year % 4 0 year % 100 ! 0) || (year % 400 0); } // 格式化日期为YYYY-MM-DD static formatDate(date) { const year date.getFullYear(); const month String(date.getMonth() 1).padStart(2, 0); const day String(date.getDate()).padStart(2, 0); return ${year}-${month}-${day}; } } // 使用示例 const today new Date(); console.log(今天:, DateCalculator.formatDate(today)); console.log(三天后:, DateCalculator.formatDate(DateCalculator.addDays(today, 3))); console.log(本月第一天:, DateCalculator.formatDate(DateCalculator.getFirstDayOfMonth(today))); console.log(2024年是闰年吗, DateCalculator.isLeapYear(2024));3.3 时区处理的最佳实践时区问题是日期处理中最复杂的部分之一。特别是在处理国际化应用时必须谨慎处理。以下是一些关键点方法返回内容注意事项getDate()本地时间的日期1-31受时区影响getUTCDate()UTC时间的日期1-31标准时间getTimezoneOffset()本地与UTC的分钟差东时区为负值toISOString()ISO格式的UTC时间字符串适合存储和传输toLocaleString()本地格式的时间字符串依赖系统区域设置// 时区转换示例 function convertTimezone(date, targetTimezoneOffset) { // targetTimezoneOffset: 目标时区与UTC的分钟差 // 例如东八区为 -480 const localOffset date.getTimezoneOffset(); // 本地时区偏移 const targetOffset targetTimezoneOffset; // 计算时间差 const offsetDiff targetOffset - localOffset; // 创建新日期 const targetDate new Date(date.getTime() offsetDiff * 60000); return targetDate; } // 显示不同时区的时间 function displayWorldTime() { const now new Date(); const times { 本地时间: now.toLocaleString(), UTC时间: now.toUTCString(), 纽约时间: convertTimezone(now, 300).toLocaleString(en-US, { timeZone: America/New_York }), 伦敦时间: convertTimezone(now, 0).toLocaleString(en-GB, { timeZone: Europe/London }), 东京时间: convertTimezone(now, -540).toLocaleString(ja-JP, { timeZone: Asia/Tokyo }) }; return times; }4. 随机数与概率分布随机数生成在游戏、抽奖、测试数据生成等场景中非常常见。Math.random()是最基础的方法但直接使用它往往不能满足复杂需求。4.1 基础随机数生成// 生成[min, max]范围内的随机整数 function randomInt(min, max) { min Math.ceil(min); max Math.floor(max); return Math.floor(Math.random() * (max - min 1)) min; } // 生成[min, max)范围内的随机浮点数 function randomFloat(min, max) { return Math.random() * (max - min) min; } // 从数组中随机选择元素 function randomChoice(array) { return array[Math.floor(Math.random() * array.length)]; } // 打乱数组Fisher-Yates洗牌算法 function shuffleArray(array) { const result [...array]; for (let i result.length - 1; i 0; i--) { const j Math.floor(Math.random() * (i 1)); [result[i], result[j]] [result[j], result[i]]; } return result; }4.2 非均匀分布随机数实际项目中我们经常需要非均匀分布的随机数。比如抽奖活动中不同奖品的中奖概率不同class WeightedRandom { constructor(items) { // items格式: [{value: 奖品A, weight: 10}, ...] this.items items; this.totalWeight items.reduce((sum, item) sum item.weight, 0); } select() { let random Math.random() * this.totalWeight; for (const item of this.items) { if (random item.weight) { return item.value; } random - item.weight; } return this.items[this.items.length - 1].value; } } // 使用示例抽奖系统 const prizePool new WeightedRandom([ { value: 一等奖, weight: 1 }, // 1%概率 { value: 二等奖, weight: 5 }, // 5%概率 { value: 三等奖, weight: 15 }, // 15%概率 { value: 谢谢参与, weight: 79 } // 79%概率 ]); // 模拟1000次抽奖 const results {}; for (let i 0; i 1000; i) { const prize prizePool.select(); results[prize] (results[prize] || 0) 1; } console.log(抽奖结果统计:, results);4.3 生成可预测的随机数种子随机数在某些场景下比如游戏回放、测试用例生成我们需要可重现的随机数序列class SeededRandom { constructor(seed Date.now()) { this.seed seed % 2147483647; if (this.seed 0) this.seed 2147483646; } // 简单的线性同余生成器 next() { this.seed (this.seed * 16807) % 2147483647; return (this.seed - 1) / 2147483646; } nextInt(min, max) { return Math.floor(this.next() * (max - min 1)) min; } nextFloat(min, max) { return this.next() * (max - min) min; } } // 测试相同的种子产生相同的序列 const rng1 new SeededRandom(12345); const rng2 new SeededRandom(12345); console.log(相同种子的随机数序列:); for (let i 0; i 5; i) { console.log(第${i 1}次:, rng1.next().toFixed(4), rng2.next().toFixed(4)); }5. 性能优化与高级技巧当处理大量数学计算或频繁的日期操作时性能就变得很重要。这里分享几个我在实际项目中总结的优化技巧。5.1 数学计算的性能优化// 缓存Math方法以提高性能在循环中特别有效 const mathCache { PI: Math.PI, sin: Math.sin, cos: Math.cos, sqrt: Math.sqrt, // ... 其他常用方法 }; // 性能对比测试 function performanceTest() { const iterations 1000000; let sum 0; // 测试1直接使用Math.sin console.time(直接调用Math.sin); for (let i 0; i iterations; i) { sum Math.sin(i * 0.01); } console.timeEnd(直接调用Math.sin); // 测试2使用缓存的方法 console.time(使用缓存方法); const { sin } mathCache; for (let i 0; i iterations; i) { sum sin(i * 0.01); } console.timeEnd(使用缓存方法); return sum; } // 预计算表适用于有限范围的函数 class TrigTable { constructor(resolution 360) { this.resolution resolution; this.sinTable new Float64Array(resolution); this.cosTable new Float64Array(resolution); // 预计算sin和cos值 for (let i 0; i resolution; i) { const angle (i * 2 * Math.PI) / resolution; this.sinTable[i] Math.sin(angle); this.cosTable[i] Math.cos(angle); } } sin(angle) { const index Math.round(angle * this.resolution / (2 * Math.PI)) % this.resolution; return this.sinTable[index 0 ? index this.resolution : index]; } cos(angle) { const index Math.round(angle * this.resolution / (2 * Math.PI)) % this.resolution; return this.cosTable[index 0 ? index this.resolution : index]; } } // 使用预计算表 const trigTable new TrigTable(720); // 0.5度精度 console.log(快速sin计算:, trigTable.sin(Math.PI / 6)); // sin(30°)5.2 日期操作的性能优化日期对象的创建和操作相对较慢特别是在循环中。以下是一些优化建议// 避免在循环中重复创建日期对象 function processDatesBad(dates) { // 不好的做法每次循环都创建新的Date对象 return dates.map(dateStr { const date new Date(dateStr); return { year: date.getFullYear(), month: date.getMonth() 1, day: date.getDate() }; }); } function processDatesGood(dates) { // 好的做法复用日期对象 const date new Date(); return dates.map(dateStr { date.setTime(Date.parse(dateStr)); return { year: date.getFullYear(), month: date.getMonth() 1, day: date.getDate() }; }); } // 使用时间戳进行计算 function addMonthsEfficient(date, months) { // 直接操作时间戳避免多次创建Date对象 const timestamp date.getTime(); const newDate new Date(timestamp); // 获取当前月份和年份 const currentMonth newDate.getMonth(); const currentYear newDate.getFullYear(); // 计算新的月份和年份 let newMonth currentMonth months; let newYear currentYear; while (newMonth 11) { newMonth - 12; newYear 1; } while (newMonth 0) { newMonth 12; newYear - 1; } // 处理月份天数溢出如1月31日1个月 const daysInMonth new Date(newYear, newMonth 1, 0).getDate(); const dayOfMonth Math.min(newDate.getDate(), daysInMonth); return new Date(newYear, newMonth, dayOfMonth); }5.3 实用工具函数集合最后分享一些我在多个项目中积累的实用工具函数// 数值处理工具 const NumberUtils { // 安全的数值比较考虑浮点数误差 approximatelyEqual(a, b, epsilon Number.EPSILON) { return Math.abs(a - b) epsilon; }, // 限制数值范围 clamp(value, min, max) { return Math.min(Math.max(value, min), max); }, // 线性插值 lerp(start, end, t) { return start * (1 - t) end * t; }, // 映射数值范围 map(value, fromMin, fromMax, toMin, toMax) { return (value - fromMin) * (toMax - toMin) / (fromMax - fromMin) toMin; }, // 判断是否为有效数值 isValidNumber(value) { return typeof value number !isNaN(value) isFinite(value); } }; // 日期处理工具 const DateUtils { // 获取相对时间描述如3天前 getRelativeTime(date) { const now new Date(); const diffMs now - date; const diffSec Math.floor(diffMs / 1000); const diffMin Math.floor(diffSec / 60); const diffHour Math.floor(diffMin / 60); const diffDay Math.floor(diffHour / 24); if (diffDay 30) { return date.toLocaleDateString(); } else if (diffDay 0) { return ${diffDay}天前; } else if (diffHour 0) { return ${diffHour}小时前; } else if (diffMin 0) { return ${diffMin}分钟前; } else { return 刚刚; } }, // 计算工作日排除周末 addBusinessDays(date, days) { const result new Date(date); let added 0; while (added days) { result.setDate(result.getDate() 1); const dayOfWeek result.getDay(); // 跳过周末0周日6周六 if (dayOfWeek ! 0 dayOfWeek ! 6) { added; } } return result; }, // 获取季度 getQuarter(date) { const month date.getMonth(); return Math.floor(month / 3) 1; }, // 格式化持续时间 formatDuration(ms) { const seconds Math.floor(ms / 1000); const minutes Math.floor(seconds / 60); const hours Math.floor(minutes / 60); const days Math.floor(hours / 24); if (days 0) { return ${days}天${hours % 24}小时; } else if (hours 0) { return ${hours}小时${minutes % 60}分钟; } else if (minutes 0) { return ${minutes}分钟${seconds % 60}秒; } else { return ${seconds}秒; } } }; // 几何计算工具 const GeometryUtils { // 计算两点距离 distance(x1, y1, x2, y2) { const dx x2 - x1; const dy y2 - y1; return Math.sqrt(dx * dx dy * dy); }, // 计算点到线段的最短距离 pointToLineDistance(px, py, x1, y1, x2, y2) { const A px - x1; const B py - y1; const C x2 - x1; const D y2 - y1; const dot A * C B * D; const lenSq C * C D * D; let param -1; if (lenSq ! 0) { param dot / lenSq; } let xx, yy; if (param 0) { xx x1; yy y1; } else if (param 1) { xx x2; yy y2; } else { xx x1 param * C; yy y1 param * D; } const dx px - xx; const dy py - yy; return Math.sqrt(dx * dx dy * dy); }, // 判断点是否在多边形内射线法 isPointInPolygon(point, polygon) { const x point[0]; const y point[1]; let inside false; for (let i 0, j polygon.length - 1; i polygon.length; j i) { const xi polygon[i][0]; const yi polygon[i][1]; const xj polygon[j][0]; const yj polygon[j][1]; const intersect ((yi y) ! (yj y)) (x (xj - xi) * (y - yi) / (yj - yi) xi); if (intersect) inside !inside; } return inside; } };这些工具函数都是我在实际项目中反复打磨过的它们处理了很多边界情况和性能考虑。比如NumberUtils.approximatelyEqual解决了浮点数比较的经典问题DateUtils.addBusinessDays考虑了周末跳过GeometryUtils.pointToLineDistance则用到了向量投影的知识。在实际使用这些数学和日期功能时最重要的是理解每个方法背后的原理和适用场景。比如如果你在做金融计算那么精度处理就必须格外小心如果是在做游戏开发性能优化可能更重要如果是企业应用时区和国际化就是必须考虑的因素。我刚开始接触这些内容时也常常被各种细节困扰。后来发现最好的学习方法就是在实际项目中应用遇到问题就深入去研究。每个看似简单的Math或Date方法背后都有值得深挖的知识点。希望这些实战经验能帮你少走些弯路。

相关新闻

基于Multisim的智能八路抢答器设计与仿真优化

基于Multisim的智能八路抢答器设计与仿真优化

1. 从零开始:为什么选择Multisim来设计你的第一个抢答器? 如果你对电子设计感兴趣,或者正在学习数字电路,想找一个既有趣又实用的项目来练手,那么设计一个八路抢答器绝对是个绝佳的选择。它麻雀虽小,五脏俱…

2026/7/4 23:42:37 阅读更多 →
WindowsAD域 利用Import-csv高效管理用户:批量创建与动态更新实战

WindowsAD域 利用Import-csv高效管理用户:批量创建与动态更新实战

1. 为什么你需要告别手动“点点点”:AD域批量管理的真实痛点 如果你是一名企业IT管理员,或者负责公司内部Windows域环境的运维,我敢打赌,你一定经历过这样的“至暗时刻”。新员工入职季,HR部门发来一份几十甚至上百人的…

2026/5/17 11:39:24 阅读更多 →
星网锐捷语音网关密码重置全攻略:两种高效恢复出厂设置方法详解

星网锐捷语音网关密码重置全攻略:两种高效恢复出厂设置方法详解

1. 引言:当密码成为拦路虎,别慌,有办法 不知道你有没有遇到过这种情况:公司里那台负责电话系统接入的星网锐捷SVX语音网关,突然需要调整配置,但你翻遍了交接文档,就是找不到管理员密码。或者&am…

2026/7/3 7:19:54 阅读更多 →

最新新闻

2026 供应商关系管理系统排行榜前十强,选型必看

2026 供应商关系管理系统排行榜前十强,选型必看

选对供应商关系管理系统,是采购数字化落地的核心前提,也是企业最容易踩坑的环节。流程脱节、版本锁死、数据孤岛,大量 SRM 项目上线半年便形同虚设,实际价值远不及预期。 据 IDC 2025 年《中国供应资源管理软件市场份额报告》测算…

2026/7/7 2:30:10 阅读更多 →
技术人做个副业有多难?发个服务帖被限流三次后,我换了个思路

技术人做个副业有多难?发个服务帖被限流三次后,我换了个思路

前阵子做了个小工具,想在一些平台上发帖推广一下,结果挺沮丧的。 发到A平台,提示"内容含推广信息,建议付费推广"→ 限流。 发到B平台,帖子发出去自己都搜不到,过两天再看——被删了,理…

2026/7/7 2:28:10 阅读更多 →
企业级开源AI 智能代码评审系统,一键部署,真正解决代码质量问题

企业级开源AI 智能代码评审系统,一键部署,真正解决代码质量问题

AI Code Review开源企业级 AI Code Review 系统,支持 Claude、Codex 等主流模型,一键部署、开箱即用,自动代码审查,企业微信、邮件通知。开源地址:https://github.com/743144627/ai-code-review.git目录结构backend/ F…

2026/7/7 2:26:09 阅读更多 →
Uber 如何规模化数字身份验证:从 Apple Wallet 证件到跨场景 Identity Verification Platform

Uber 如何规模化数字身份验证:从 Apple Wallet 证件到跨场景 Identity Verification Platform

本文是对 Scaling Verify with Wallet for Identity Verification at Uber 的整理与翻译。 内容结构概览 本文会围绕 Uber 如何将 Apple 的 Verify with Wallet API 接入并规模化到自己的身份验证平台展开,主要包括: 为什么身份验证是 Uber Trusted Id…

2026/7/7 2:24:09 阅读更多 →
Docker run/exec/attach 命令区别 + 容器资源限制实战

Docker run/exec/attach 命令区别 + 容器资源限制实战

第4章 容器 摘要: 本章全面介绍了 Docker 容器的核心概念与操作实践。内容涵盖容器生命周期管理(创建、启动、停止、重启、暂停、删除)、资源限制(内存、CPU)、容器导入导出以及底层实现技术。重点讲解了 docker run、…

2026/7/7 2:24:09 阅读更多 →
本地AI图像视频生成工具部署指南:从环境配置到批量任务实战

本地AI图像视频生成工具部署指南:从环境配置到批量任务实战

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 这次我们来看一个本地部署的AI图像和视频生成工具,从标题看它声称能"吊打"市面上的同类产品,支持免…

2026/7/7 2:24:09 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻