ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

JS热搜词背后的前端实战:从字符串判断到脚本安全

JS热搜词背后的前端实战:从字符串判断到脚本安全 我盯着这个随手记下的编号看了很久它本身没有任何含义倒是它后面那一串关于 JS 的热搜词让我觉得比很多正经标题都有内容。“js散度”“js三级联动”“js判断字符串是否包含”“js生成word文档有哪些js库”“lxmusic音源js在线导入”“js反爬实战”“js宏”……这些词放到一起像是一张前端开发者真实工作场景的切片图。有人卡在最基础的字符串判断上有人在研究组件联动的状态问题也有人摸到了第三方脚本和代码安全这条灰色边缘。这篇文章不打算追新框架也不打算给某个固定项目做复盘而是想把这串热搜词按真实项目里出现的频率重新过一遍聊聊每个搜索背后的技术本质、常见做法和容易踩的坑。适合正在写业务代码的初中级前端也适合想用 JavaScript 写自动化脚本和小工具的开发者。1. 字符串包含、空对象判断与event参数最常被搜的基础语法坑1.1 判断字符串包含不是includes就完事了“js判断字符串是否包含”基本是常年霸榜的基础问题只要你在前端待过一阵总会碰上模糊搜索、关键字过滤、URL参数匹配这种需求。大多数人第一反应是str.includes(keyword)这没问题但真扔到项目里坑往往藏在“忽略大小写”这几个字后面。用户输入“javascript”数据库里存的是“JavaScript”你直接includes匹配不中得先统一大小写再做判断。最简单的写法是str.toLowerCase().includes(keyword.toLowerCase())把两边都转成小写再比逻辑清晰、性能可以接受99% 的业务场景都够用。另一种方案是用new RegExp(keyword, i)但这里有个新手一般想不到的坑如果 keyword 里带着.、*、?这些正则特殊字符就直接被当成正则语法解析了轻则匹配不到重则直接抛异常。所以但凡 keyword 来自用户输入用正则之前先keyword.replace(/[.*?^${}()|[\]\\]/g, \\$)做转义或者干脆别用正则继续走toLowerCase。还有一层老项目的兼容性。includes是 ES6 才加的如果你在维护一个 2015 年之前的内部系统可能要退回到str.indexOf(keyword) 0的写法。indexOf虽然啰嗦一点但它能顺手帮你拿到匹配位置在需要高亮匹配片段的时候就派上用场了。顺带说一个同是热搜的“js验证url有效性”。这个需求也经常和字符串处理一起出现我建议直接用new URL(str)包一层try/catch。它会把非法链接直接抛异常合法链接还能顺手拆出protocol、host、pathname等属性。很多人喜欢自己写正则去验证 URL结果不是漏掉带端口的地址就是漏掉带 query 的地址属实没必要。1.2 判断空对象Object.keys之外的另一面“判断是不是空对象 js”这个搜索词热度一直很高原因很简单Object.keys(obj).length 0是最常用的写法但它有一些隐藏前提。Object.keys只统计可枚举的自有属性如果一个对象用Object.defineProperty定义了不可枚举属性它的Object.keys长度照样是 0这时候它算不算“空对象”从业务角度说不算但从Object.keys的视角看它就是空的。另一种常见写法是JSON.stringify(obj) {}。这种写法偶尔能应付“原始对象没有值”的场景但坑也不小对象里的属性值如果是undefined、函数、Symbol会被JSON.stringify直接忽略掉。也就是说{ a: undefined }序列化出来也是{}会被误判为空对象。而且序列化一个深层对象本身就是有开销的我见过有人在一个大数组循环里频繁做这种判断页面直接卡顿。真正稳一点的方案是for...in配合hasOwnProperty。for...in会把可枚举的自有属性和继承属性都遍历出来配合hasOwnProperty过滤之后只要进入循环体就说明存在自有属性返回 false 就行。不过我也得说句实话99% 的业务代码里Object.keys直接判断已经足够了只有当你处理的数据对象被各种库改造过、属性描述符比较特殊时才需要换成for...in方案。“js for循环跳出循环”也常被人搜到这属于同一个“基础语法易错”类问题。break只能跳出一层循环continue是跳当前次想跳出外层循环就得用label但label的可读性太差实际项目里我更推荐把内层循环抽成一个函数用return代替跳转代码更清楚测试也好写。1.3 event参数、this指向与表单取值“js 事件中的 event”被反复搜索主要原因是不同环境里event的获取姿势不一样。老版本 IE 需要从window.event拿现代浏览器直接读事件回调的第一个参数React 的合成事件又是另一套包装。跨环境经验多了之后你会发现真正的难点不是怎么拿event而是搞明白target、currentTarget和this三者的关系。在addEventListener回调里普通函数的this指向当前绑定监听的那个元素而event.target指向真正触发事件的元素。这俩在事件委托场景下经常不一致你在父容器上绑了点击事件用户点的是子元素currentTarget是父容器target是子元素。判断“点到了谁”应该看target判断“事务发生在哪个容器”才看currentTarget。还有preventDefault和stopPropagation一个是阻止默认行为一个是阻止事件继续冒泡这俩经常被混到一起用其实语义完全不同。顺便把另一个热词“js屏蔽”也在这里说清楚。很多人搜“屏蔽”是想屏蔽右键菜单、屏蔽复制、屏蔽开发者工具这些本质上都是调用preventDefault去阻止默认行为。但从产品体验角度我不建议把这些东西写死用户真要复制你的文本总有办法屏蔽只会增加正常用户的挫败感。如果只是想屏蔽某个按钮误触直接在对应事件里preventDefault就够了别上升到全页面级别。表单取值也经常和事件一块儿出现。比如 Element 的el-input-numberv-model拿到的值可能和接口要的string类型对不上提交之前要再做一次类型转换。这不算 bug而是组件值和业务数据结构之间的映射问题处理好了能少很多“提交后校验失败”的工单。2. 三级联动、倒计时、裁剪与跨iframe刷新页面组件需求拆解2.1 三级联动数据组织和状态切换才是本体“js三级联动”这个搜索词基本等价于省市区选择器。表面上看起来是个表单交互实际难点全在数据组织方式上。后端给你的数据一般有两种形态一种是树形结构省下面挂着市市下面挂着区前端递归渲染就行另一种是扁平数组每条数据带一个parentId选省的时候拿省的 code 去筛市。很多人做不好三级联动问题不在渲染而在切换上级之后没有重置下级的状态。最容易踩的坑是这样的用户选了“广东省”再选“广州市”最后把省改成“浙江省”结果区的下拉框里还留着“天河区”。要解决这个问题必须在省 change 的时候把市的选中值和列表清空在市 change 的时候把区的选中值和列表清空。链式重置这步没做后面全是脏数据。如果数据量不大我的习惯是直接让后端一次返回完整树形结构前端本地过滤。好处很明显切换省市区不用再发请求体验更顺滑代码也更直白。真正要按需加载的场景是数据量大到一次加载太慢这时候才走“选省拉市、选市拉区”的请求链那就要更加注意异步竞态用户快速切换时上一次请求可能比下一次更晚返回把旧数据覆盖到新选中的省上。解决方案是给请求加一个序列号或者 AbortController只接受最新一次的结果。同类的“datatable js”和“el-input-number”搜索词也经常和表单联动混在一起。数据表格增强库比如 DataTables 的好处是排序、分页、搜索开箱即用但它的数据模型是独立维护的电子表格的筛选条件必须当成一个统一状态对象来管理否则切换页码之后你的搜索条件很容易被丢掉。2.2 倒计时setInterval模式和销毁时机“js css倒计时”这个搜索词把两件事一块提了视觉上的倒计时进度和时间计算逻辑。CSS 能帮你做进度条的宽度动画但真正的时间基准还得靠 JavaScript。新手最容易写的倒计时是这样的let count 60; setInterval(() count--, 1000)。看起来没毛病但浏览器一切后台或者主线程被其他任务卡一下定时器就会漂移。原因是setInterval只是“每隔一段时间把回调扔进队列”它并不保证精确的一秒。正确的做法是记录一个目标时间点然后在每次定时回调里用当前时间Date.now()去和目标时间点算差值再根据差值换算成分钟和秒。这样哪怕中间某次回调延迟了 500ms显示出来的剩余时间依然是准的。计算过程很简单remaining Math.max(0, Math.floor((targetTime - Date.now()) / 1000))再拆成MM:SS格式。另一个人人都容易忽略的点是销毁时机。组件卸载、倒计时归零、页面隐藏这几个节点都要考虑清理定时器。用 React 就在useEffect的 return 里写clearInterval用 Vue 就在onUnmounted里做。内存泄漏这件事不会在开发环境立刻表现出来但页面挂久了你会发现卡顿越来越明显。移动端场景还要额外注意应用切后台后定时器可能被挂起很多成熟的实现会在visibilitychange事件里重新计算剩余时间而不是傻等定时器回调。2.3 比例截图、PDF缩略图与iframe刷新父页面“jcrop js版比例截图”说明现在还是有不少项目在用图片裁剪。jcrop 这个库本身不复杂核心就两个参数aspectRatio控制比例setSelect设置初始选区。实际用下来最容易翻车的点永远是初始化时机。容器还没显示、图片还没加载完就调new jcrop插件内部算出来的尺寸全是错的裁剪框会偏得离谱。解决方案也很简单确认图片load事件触发后再初始化或者等元素在页面里真正可见后再执行。“js中pdf缩略图”的常规做法是用 pdf.js 把每一页渲染到 canvas 上。这里有个性能陷阱如果你拿到一个 50 页的 PDF一次性把 50 页全部渲染出来内存立刻爆炸移动端直接白屏。我习惯做成滚动到可视区域再渲染渲染完的 canvas 对象及时保留离开可视区域后做销毁或复用。这其实就是所有“长列表”场景统一要解决的虚拟渲染问题PDF 缩略图只是其中一种形态。“iframe关闭jquery并刷新父页面js”是一段非常生动的搜索词几乎是所有后台管理系统开发者的共同记忆。子 iframe 里操作完保存要通知父页面刷新列表最粗暴的写法是window.parent.location.reload()。这个写法能用但有一个边界必须清楚如果 iframe 和父页面跨域直接操作parent.location会报跨域错误此时最稳的做法是用postMessage发一条消息给父页面让父页面自己决定是否刷新。用 jQuery 的老系统也是一样的逻辑jQuery 只提供选择器和事件封装跨窗口通信的核心还是浏览器原生机制。3. 生成Word、挑后端框架、用JS做宏选型和环境问题3.1 JS生成Word文档别一上来就选最重的方案“js生成word文档有哪些js库”被反复搜索说明导 Word 是业务里特别常见的刚需但 JS 生态里做 Office 文档生成的方案确实没有后端语言那么成熟。我的选型逻辑很简单先判断业务属于“生成一份全新文档”还是“填充一份已有模板”。如果是从零生成一份带标题、段落、表格的.docx我用得最多的是docx这个 npm 包。它把 Word 的节点模型封装成了 JavaScript API写起来有点像是在拼 JSON 树能力很完整支持 Node 和浏览器两端。缺点是你要理解文档结构团队里如果完全是业务人员在使用上手成本偏高。如果业务里有一堆模板比如几十种合同、报告、通知单每次只是字段值不一样那首选是docxtemplater。它本质上是一个模板引擎把占位符写在真正的 docx 模板文件里运行时用数据去填充。最大的好处是排版不用前端管业务在 Word 里改模板就行前端只负责把表单数据和模板绑定起来。如果只是“把网页上一段内容导成 Word 方便用户下载”那别想太复杂直接用 html 转 Word 的思路或者把 HTML 写进 Blob 指定 MIME 为application/msword就能跑。但这种做法样式还原不稳定页眉页脚、复杂表格很容易丢只能算应急方案。真到复杂场景我的原则是超过两页的正式文档基本就建议后端同学用服务端专业库生成前端只接一个下载链接。前端方案适合快速导出不适合做重型排版。3.2 Node.js后端框架Express、NestJS还是Fastify“想用js写一个后端项目用什么框架好”这个问题没有标准答案因为不同项目形态需要的能力差别很大。Express 是最经典的入门选择生态老、中间件模式直观适合写小服务、API 网关、脚本服务。但项目一大、人一多Express 的目录结构和依赖注入全靠自觉代码风格很容易走样。NestJS 则是把模块化、依赖注入、TypeScript 的最佳实践全部打包进来适合团队协作的中大型项目。它的代价是学习曲线陡样板代码多小项目用它反而像杀鸡用牛刀。Fastify 主打高性能和内置 schema 校验做 API 服务比 Express 更现代插件生态也在快速追赶。如果只是写一个临时接口或者轻量应用现在还可以看 Hono 这类极简框架部署到边缘运行环境也很方便。我的实操建议是个人项目选你自己最熟的团队项目选大家接手成本最低的。另外再提醒一个环境细节装 Node.js 时尽量不要从官网下最新版一路点到底。用 nvm 管理多版本会省很多事因为不同项目依赖的 Node 版本可能不一样升上去之后一堆原生模块需要重新编译容易把人逼疯。3.3 WPS JS宏与浏览器里的JS片段管理“wps js宏”这两年热度明显上来了。WPS 开始支持用 JavaScript 写宏脚本对只会 JavaScript、不熟悉 VBA 的人来说是个好消息。写宏的本质是用宿主提供的对象模型操作文档和表格比如wps.Application、Workbooks、Range这类 API。和浏览器 JS 最大的区别是宏环境里没有window和document没有 DOM 事件只有 WPS 的对象模型。习惯浏览器开发的人第一次切过去会很别扭调试也不如浏览器方便。办公自动化的常见场景比如批量处理表格、合并 sheet、按模板生成文档逻辑其实和 Node 脚本一样只是调用的是不同宿主 API。遇到具体需求先翻官方对象模型文档比自己在网上折腾示例代码靠谱得多。另一个热词“chrome 保存js文件的扩展程序source”也属于环境问题。很多人想在浏览器里持久化一段 JS 脚本其实不需要装扩展Chrome DevTools 的 Sources 面板自带 Snippets 功能可以把常用工具函数保存下来在任意页面直接运行。养成把高频调试代码放进 Snippets 的习惯比装一堆扩展程序更可靠。4. 函数是对象、原型链与继承演进语言底子决定排查速度4.1 函数是对象吗一句话回答但展开有很多层是的JavaScript 里的函数就是对象。typeof function(){}返回的是function但函数具备对象的一切特征可以添加属性、可以作为参数传递、可以作为返回值。函数对象和普通对象的差异在于内部多了一个可调用的[[Call]]方法所以它能被执行构造函数则额外拥有prototype属性用来给实例提供共享方法。理解这一点之后很多 JS 特有的技巧就顺理成章了。函数可以“持有自己的状态”所以你能写带缓存的函数函数可以捕获外层变量并返回内部函数所以有闭包函数可以被塞进另一个函数当回调所以有高阶函数。这也是“为何很少人愿意手写js”这个热搜词的一个侧面回答框架和工程化已经把语言能力封装成声明式 API写业务的时候不用关心底层对象模型。但一旦遇到“为什么我这个回调被调用之后this不对”这种问题还是得回到“函数是对象、this指向调用方式”这个层面来排查。4.2 原型和原型链图和概念之外的实际用法JavaScript 的对象有一个隐藏属性__proto__它指向创建这个对象的构造函数的prototype对象。读取一个对象的属性时如果对象自身没有就会沿着__proto__链往上找直到Object.prototype再往上就是null。这个链条就是常说的原型链。很多人把prototype和__proto__搞混记住一个口诀实例只有__proto__构造函数才有prototype。函数本身作为对象也有__proto__指向Function.prototype。实际开发里直接操作原型链的场景不多但调试第三方库时经常能看到很深的继承结构。如果你不知道用Object.getPrototypeOf去检查一个对象的真实原型看到“这个对象为什么有某个方法”时会非常困惑。Object.create也是很有用的工具它可以显式指定一个对象的原型是实现继承和创建“干净对象”的常用手段。4.3 继承从原型链到class语法糖继承方式的发展史也是前端面试的高频题目因为它能顺便看出你对函数和对象模型的理解程度。最原始的原型链继承做法是让子类的原型指向一个父类实例。优点是简单缺点是父类实例上的引用类型属性会被所有子类实例共享改一个全变。构造函数继承则解决了属性隔离在子类构造函数里调用父类函数给每个实例单独赋值但方法又没法共享而且父类构造函数会被重复执行。组合继承把两者结合起来用能解决问题但父类构造函数还是会被调用两次。寄生组合继承是比较公认的完美方案核心代码就一行Child.prototype Object.create(Parent.prototype)手动设置constructor指回 Child 就能得到一个干净的子类原型。ES6 的class和extends底层还是这一套只是把写法收敛成了更符合直觉的语法糖。5. 音源脚本在线导入、外部JS引入与代码安全一道绕不过的坎5.1 为什么音源脚本流行“在线导入”热搜里“lxmusic音源js在线导入”一类的词特别多我不在这里讨论任何具体音乐服务的配置方式但可以聊聊它背后非常典型的工程现象很多开源播放器项目支持用户自定义音源脚本脚本通过一个在线 URL 被加载进播放器用来扩展内容获取能力。在线导入的价值很直接内容源一旦更新服务端改一版脚本客户端下次加载就是新逻辑用户不用重新下载整个应用集成方也不用频繁发版。这和 Web 生态里“远程配置”“动态加载”的思路是一模一样的。但风险也随着这种便利被放大了。你加载的是一段可执行代码等于把一个宿主环境的全部权限交给了一个第三方来源。未经审查的在线脚本可能夹带各种非法逻辑轻则收集你的账号、上报使用记录重则读取本地数据甚至篡改行为。这类实践在版权层面也容易引发争议所以我个人的态度是做技术研究可以直接放进正式项目使用必须格外谨慎至少要把下面这层安全检查过一遍。5.2 外部JS引入前的检查清单几行代码的差距不管是什么第三方脚本引入前我建议按顺序做这几项检查。第一看来源域名是不是可信任的有没有启用 HTTPS一个长期维护的开源仓库和一个个人小站可信度完全不同。第二看行为代码里有没有读取document.cookie、localStorage有没有往外部域名发fetch或XMLHttpRequest有没有出现eval、new Function这类动态执行代码。这些 API 不是不能用但出现得越密集越需要警惕。第三锁定版本能指定具体版本就不要用latest能锁定内容哈希就不要只靠版本号。浏览器引入外部 JS 时可以用 SRI 机制给script标签加integrity属性和crossorigin属性浏览器会在执行前校验内容哈希文件被篡改就直接拒绝执行。script srchttps://example.com/lib.js integritysha384-oqVuAfXRKap7fdgcCY5uykM6R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC crossoriginanonymous/script就算过了这三关外部脚本也可能在你不知情的情况下调整行为。能不用外部动态脚本就尽量不用必须用的时候最好配一个独立的域名白名单定期对比脚本内容变化。很多团队把这段检查写进发布流程遇到“js脚本”“js引入”相关的工单时直接按清单跑一遍效率会高很多。“MC路JS”“MC JS cool”这类游戏生态里的脚本插件也是一个道理脚本越漂亮越要确认它的来源和权限边界。5.3 关于JS逆向、反爬与混淆的合规边界“js反爬实战”和“js逆向”同样是高频搜索词。这两个词本身没有错做安全研究的工程师会用到防御黑灰产也会用到。但作为技术分享我对具体绕过手法的态度很明确不教、不鼓励。未经授权抓取数据、绕过平台风控不仅法律风险很大也会破坏服务提供方的公平性。从防御方的角度看JS 混淆、压缩只是增加逆向的时间成本不可能做到绝对安全。真正靠得住的是服务端鉴权、参数校验、数据接口的风控策略和日志监控。如果你刚接触这个概念我建议把精力花在理解浏览器端代码执行流程和服务端职责划分上而不是研究怎么绕过一个站点。前端加密的目的是防止明文传输过程中的意外泄露不是制造“不可破解”的假象。6. 冷门热词大扫盲JS散度、归一化坐标与legacy警告6.1 JS散度不是JavaScript热词里的同名快乐“js散度”排在这串热搜词里第一眼真的会让人以为是 JavaScript 的新特性。实际上它是 Jensen-Shannon 散度的缩写一个信息论和概率统计里的概念用来衡量两个概率分布之间的相似程度。我经常用一个类比来解释把两个概率分布想象成两堆不同形状的沙子散度差不多等于“把一堆沙子移成另一堆形状需要多少工作量”。工作量越小说明两个分布越接近。JS 散度是 KL 散度的对称化版本所以它比 KL 散度更适合用来做文本相似度、聚类、机器学习评估这类任务。前端会碰到这个词的场景通常是数据分析你在浏览器里做一些用户行为分布对比、AB 实验数据的最小分析、或者画分布对比图都有可能见到它。它和 JavaScript 语言本身毫无关系但这并不妨碍它在 JS 相关的热搜列表里出现。这个案例给我的经验是搜索之前先分清楚语境尤其是这种广播式缩写踩坑成本往往很低但很浪费时间。6.2 归一化坐标处理图形和数据可视化的通用思路“js 归一化坐标”也是一个覆盖很广的概念。核心思想是把不同尺寸下的坐标值映射到一个统一范围比如 0 到 1让算法逻辑不依赖具体像素值。在 Canvas 里最典型的例子是鼠标坐标换算。原生点击事件的clientX、clientY是相对视口的要换成 Canvas 坐标系里的坐标需要减去 canvas 相对页面左上角的位置再乘以 canvas 的物理尺寸和 CSS 显示尺寸的比例。这段代码我几乎每个项目都会用const rect canvas.getBoundingClientRect(); const x (e.clientX - rect.left) * canvas.width / rect.width; const y (e.clientY - rect.top) * canvas.height / rect.height;很多人直接拿e.clientX去画图画出来的位置总是偏的问题就出在少了getBoundingClientRect的偏移修正。做折线图、热力图、拖拽交互时先把数据归一到 0 到 1再映射到具体坐标系代码会好写很多也不用每个函数里重复处理边界。6.3 deprecation warning被忽略的警告才是最大的坑热搜里那条deprecation warning [legacy-js-api]: the legacy js api is deprecated应该来自某个库升级后的控制台输出。这类警告很容易被开发者无视因为程序还能跑只是打了个黄字。但隐患恰恰在这里很多库会给一个宽限期过了两个版本之后旧 API 直接被移除等你升级的时候线上代码瞬间崩掉。正确处理方式是收到警告之后去项目里搜一下对应的旧 API 调用按官方迁移文档批量替换。如果你用的是大型代码库可以考虑用 codemod 工具做自动化迁移搜索替换之后再靠类型检查或单测兜底。这里也顺带说“js格式化”为什么经常被搜到很多 deprecation 不是逻辑错误而是历史写法太旧。项目里只要统一接上 ESLint 和 Prettier风格一致后清理这种历史债务的成本会明显下降。更进一层可以把“禁止使用某个旧 API”直接配置成 lint 规则让机器提醒你而不是靠人的记忆力。7. 从俄罗斯方块到公式计算几个小功能把JS核心过一遍7.1 俄罗斯方块碰撞检测和旋转是整个代码的难点热词“htmljs俄罗斯方块 直接复制全部代码 保存为tetris.html”说明很多人都想快速拿到一个能运行的玩具。俄罗斯方块这个项目确实特别适合学 JS因为它覆盖了数组、坐标建模、碰撞检测、事件监听和游戏循环。核心思路很简单棋盘是一个二维数组当前落下的方块是一个小块矩阵。每一步下落前把方块矩阵和棋盘数组对应位置做一次重叠判断没有重叠就落有重叠就固化并生成新方块。旋转是另一个难点。常见的旋转实现是先对矩阵做转置再翻转每一行相当于 90 度旋转。这套数学操作在数组上很好模拟理解了它你对二维数组的操作能力会上升一个台阶。游戏循环不要用setInterval固定每 500ms 走一格而是在requestAnimationFrame的主循环里累加时间差达到下落间隔才执行一次。这样浏览器掉帧、标签页切走再回来时游戏时间也不会突然后跳。这个小玩具做完你对 JS 的基础语法和典型的浏览器运行时限制就都有体感了。7.2 扑克牌、公式计算和base转file轮子背后的原理“js扑克牌代码”搜的人不少最核心的点其实是洗牌算法。正确的做法是 Fisher-Yates 原地洗牌从数组尾部往前遍历每次随机挑一个前面的位置交换。很多人图省事写arr.sort(() Math.random() - 0.5)结果分布不均匀还会受浏览器排序算法影响。洗牌不是小事涉及概率公平性的场景都得用 Fisher-Yates。“js公式计算”的情况类似第一反应是eval但eval在项目里是安全隐患来源。简单四则运算可以自己写解析复杂公式直接引入mathjs这类库它们至少能做输入白名单避免任意标识符被执行。至于“js base 转 file”这个场景在前端上传图片时经常遇到核心是把 base64 解码成二进制再包成 File 对象。代码很简单核心是atob和Uint8Array那几步转换。这几个小功能单看都不难但把它们串起来体现的是一种拆解能力把一个模糊的需求拆成清晰的数据转换步骤。我个人在实际开发中的体会是热搜列表就是最好的自测清单。字符串判断、三级联动、倒计时、Word 导出、框架选型、原型链、外部脚本安全每一个都能讲清楚原理、写得出手动实现再新的框架出现也不会慌。至于音源脚本、逆向反爬这类带灰色属性的词保持边界感比掌握技术更重要。技术能力本身没有立场但用在哪里、为什么用才是我们要想清楚的事。
返回列表