首页 文章 精选 留言 我的

精选列表

搜索[JavaScript库],共10000篇文章
优秀的个人博客,低调大师

JavaScript 中 async/await 与 forEach 搭配使用时的常见陷阱与正确做法

在维护一个后台管理系统的数据导出功能时,我遇到了一个诡异的问题:前端发起导出请求后,接口返回的 Excel 文件总是只有部分数据。排查后发现,代码在 `Array.prototype.forEach` 中使用了 `async/await` 来逐条请求数据,但 `forEach` 不会等待异步回调完成,导致请求在循环结束后才陆续发出,而后续的打包逻辑已经执行了。这个问题在日常开发中很常见,尤其是在需要顺序处理数组元素、每个元素都要发起异步请求的场景下。很多人以为 `await` 放在 `forEach` 回调里就能让整个循环暂停,实际上 `forEach` 内部只是同步调用回调,并不会等待返回的 Promise。这篇文章会解释为什么 `forEach` 和 `async/await` 不能按预期工作,对比 `for...of`、`map` 加 `Promise.all`、以及 `reduce` 等替代方案的行为差异,同时给出真实可用的代码示例和选择依据。 ## 为什么 forEach 里的 await 不起作用 先看一段典型的错误代码。假设要从接口依次获取每个用户的详细信息,然后组合成一份报表: ```js async function fetchUserDetail(id) { const res = await fetch(`/api/user/${id}`); return res.json(); } async function buildReport(userIds) { const results = []; userIds.forEach(async (id) => { const detail = await fetchUserDetail(id); results.push(detail); }); console.log(results.length); // 很可能输出 0 return results; } ``` 调用 `buildReport` 后,`results` 几乎总是空数组或者长度不完整。原因是 `forEach` 的签名是 `arr.forEach(callback)`,它的执行逻辑可以用下面这段伪代码表示: ```js Array.prototype.forEach = function(callback) { for (let i = 0; i fetchUserDetail(id)); const results = await Promise.all(promises); return results; } ``` `map` 和 `forEach` 一样是同步的,但它会把回调的返回值收集起来,所以 `promises` 是一个 Promise 数组。`Promise.all` 会等待所有 Promise 变为 fulfilled,并按原数组顺序返回结果。这里有一个容易被忽略的点:`Promise.all` 只要有一个 Promise 被 reject,整个调用就会立即 reject,其他未完成的请求不会被取消。如果希望某个请求失败不影响整体,可以用 `Promise.allSettled`,它返回每个 Promise 的状态和值。 ```js async function buildReport(userIds) { const promises = userIds.map(id => fetchUserDetail(id)); const settled = await Promise.allSettled(promises); const results = settled .filter(item => item.status === 'fulfilled') .map(item => item.value); return results; } ``` ## 顺序处理但想收集结果:for await...of 如果处理的是异步可迭代对象(比如一个返回异步迭代器的分页接口),可以用 `for await...of`。它和 `for...of` 的区别在于每次迭代的值是通过 `await` 获取的。 ```js async function* fetchPages() { let page = 1; while (page { try { await fetch(`/api/track/${id}`); } catch (err) { console.error('track failed', id, err); } }); ``` 如果连 catch 都不想写,至少加一个 `.catch`: ```js userIds.forEach(id => { fetch(`/api/track/${id}`).catch(err => console.error(err)); }); ``` 但更好的做法是明确用 `Promise.allSettled` 来管理这批请求,即使不阻塞后续逻辑,也能在需要时知道哪些失败了。 ## reduce 做顺序链式调用 有些老代码里会看到用 `reduce` 来顺序执行异步操作,像这样: ```js async function buildReport(userIds) { const results = await userIds.reduce(async (accPromise, id) => { const acc = await accPromise; const detail = await fetchUserDetail(id); acc.push(detail); return acc; }, Promise.resolve([])); return results; } ``` 这种写法能工作,但可读性差,而且容易忘记初始值必须是 `Promise.resolve([])`。除非有特殊需求,否则 `for...of` 更清晰。 ## 实际选择建议 没有依赖关系、希望尽快完成:`map` + `Promise.all`(或 `allSettled`)。 需要严格按顺序、后一个依赖前一个:`for...of` + `await`。 处理异步流或分页迭代器:`for await...of`。 只是触发异步操作、不关心结果:`forEach` 可以,但要处理 rejection。 回到最开始那个导出功能,我把 `forEach` 改成了 `map` 加 `Promise.all`,请求并发发出,等所有数据返回后再生成 Excel,问题消失,整体耗时也降下来了。这类问题本质上是对 `forEach` 设计意图的理解偏差——它就是一个同步遍历工具,不负责协调异步流程。 推荐查看天气:https://www.40tianqi.com/duji/ 推荐查看天气:https://www.40tianqi.com/duji/zuotian.html 推荐查看天气:https://www.40tianqi.com/duji/7tian.html 推荐查看天气:https://www.40tianqi.com/duji/10tian.html 推荐查看天气:https://www.40tianqi.com/duji/15tian.html 推荐查看天气:https://www.40tianqi.com/duji/40tian.html 推荐查看天气:https://www.40tianqi.com/lieshan/ 推荐查看天气:https://www.40tianqi.com/lieshan/zuotian.html 推荐查看天气:https://www.40tianqi.com/lieshan/7tian.html 推荐查看天气:https://www.40tianqi.com/lieshan/10tian.html 推荐查看天气:https://www.40tianqi.com/lieshan/15tian.html 推荐查看天气:https://www.40tianqi.com/lieshan/40tian.html 推荐查看天气:https://www.40tianqi.com/huaibeisuixi/ 推荐查看天气:https://www.40tianqi.com/huaibeisuixi/zuotian.html 推荐查看天气:https://www.40tianqi.com/huaibeisuixi/7tian.html 推荐查看天气:https://www.40tianqi.com/huaibeisuixi/10tian.html 推荐查看天气:https://www.40tianqi.com/huaibeisuixi/15tian.html 推荐查看天气:https://www.40tianqi.com/huaibeisuixi/40tian.html 推荐查看天气:https://www.40tianqi.com/tongling/ 推荐查看天气:https://www.40tianqi.com/tongling/zuotian.html 推荐查看天气:https://www.40tianqi.com/tongling/7tian.html 推荐查看天气:https://www.40tianqi.com/tongling/10tian.html 推荐查看天气:https://www.40tianqi.com/tongling/15tian.html 推荐查看天气:https://www.40tianqi.com/tongling/40tian.html 推荐查看天气:https://www.40tianqi.com/jiaoqu/ 推荐查看天气:https://www.40tianqi.com/jiaoqu/zuotian.html 推荐查看天气:https://www.40tianqi.com/jiaoqu/7tian.html 推荐查看天气:https://www.40tianqi.com/jiaoqu/10tian.html 推荐查看天气:https://www.40tianqi.com/jiaoqu/15tian.html 推荐查看天气:https://www.40tianqi.com/jiaoqu/40tian.html 推荐查看天气:https://www.40tianqi.com/anqing/ 推荐查看天气:https://www.40tianqi.com/anqing/zuotian.html 推荐查看天气:https://www.40tianqi.com/anqing/7tian.html 推荐查看天气:https://www.40tianqi.com/anqing/10tian.html 推荐查看天气:https://www.40tianqi.com/anqing/15tian.html 推荐查看天气:https://www.40tianqi.com/anqing/40tian.html 推荐查看天气:https://www.40tianqi.com/yixiu/ 推荐查看天气:https://www.40tianqi.com/yixiu/zuotian.html 推荐查看天气:https://www.40tianqi.com/yixiu/7tian.html 推荐查看天气:https://www.40tianqi.com/yixiu/10tian.html 推荐查看天气:https://www.40tianqi.com/yixiu/15tian.html 推荐查看天气:https://www.40tianqi.com/yixiu/40tian.html 推荐查看天气:https://www.40tianqi.com/huaining/ 推荐查看天气:https://www.40tianqi.com/huaining/zuotian.html 推荐查看天气:https://www.40tianqi.com/huaining/7tian.html 推荐查看天气:https://www.40tianqi.com/huaining/10tian.html 推荐查看天气:https://www.40tianqi.com/huaining/15tian.html 推荐查看天气:https://www.40tianqi.com/huaining/40tian.html 推荐查看天气:https://www.40tianqi.com/congyang/ 推荐查看天气:https://www.40tianqi.com/congyang/zuotian.html 推荐查看天气:https://www.40tianqi.com/congyang/7tian.html 推荐查看天气:https://www.40tianqi.com/congyang/10tian.html 推荐查看天气:https://www.40tianqi.com/congyang/15tian.html 推荐查看天气:https://www.40tianqi.com/congyang/40tian.html 推荐查看天气:https://www.40tianqi.com/anqingqianshan/ 推荐查看天气:https://www.40tianqi.com/anqingqianshan/zuotian.html 推荐查看天气:https://www.40tianqi.com/anqingqianshan/7tian.html 推荐查看天气:https://www.40tianqi.com/anqingqianshan/10tian.html 推荐查看天气:https://www.40tianqi.com/anqingqianshan/15tian.html 推荐查看天气:https://www.40tianqi.com/anqingqianshan/40tian.html 推荐查看天气:https://www.40tianqi.com/taihu/ 推荐查看天气:https://www.40tianqi.com/taihu/zuotian.html 推荐查看天气:https://www.40tianqi.com/taihu/7tian.html 推荐查看天气:https://www.40tianqi.com/taihu/10tian.html 推荐查看天气:https://www.40tianqi.com/taihu/15tian.html 推荐查看天气:https://www.40tianqi.com/taihu/40tian.html 推荐查看天气:https://www.40tianqi.com/susong/ 推荐查看天气:https://www.40tianqi.com/susong/zuotian.html 推荐查看天气:https://www.40tianqi.com/susong/7tian.html 推荐查看天气:https://www.40tianqi.com/susong/10tian.html 推荐查看天气:https://www.40tianqi.com/susong/15tian.html 推荐查看天气:https://www.40tianqi.com/susong/40tian.html 推荐查看天气:https://www.40tianqi.com/wangjiang/ 推荐查看天气:https://www.40tianqi.com/wangjiang/zuotian.html 推荐查看天气:https://www.40tianqi.com/wangjiang/7tian.html 推荐查看天气:https://www.40tianqi.com/wangjiang/10tian.html 推荐查看天气:https://www.40tianqi.com/wangjiang/15tian.html 推荐查看天气:https://www.40tianqi.com/wangjiang/40tian.html 推荐查看天气:https://www.40tianqi.com/anqingyuexi/ 推荐查看天气:https://www.40tianqi.com/anqingyuexi/zuotian.html 推荐查看天气:https://www.40tianqi.com/anqingyuexi/7tian.html 推荐查看天气:https://www.40tianqi.com/anqingyuexi/10tian.html 推荐查看天气:https://www.40tianqi.com/anqingyuexi/15tian.html 推荐查看天气:https://www.40tianqi.com/anqingyuexi/40tian.html 推荐查看天气:https://www.40tianqi.com/huangshan/ 推荐查看天气:https://www.40tianqi.com/huangshan/zuotian.html 推荐查看天气:https://www.40tianqi.com/huangshan/7tian.html 推荐查看天气:https://www.40tianqi.com/huangshan/10tian.html 推荐查看天气:https://www.40tianqi.com/huangshan/15tian.html 推荐查看天气:https://www.40tianqi.com/huangshan/40tian.html 推荐查看天气:https://www.40tianqi.com/tunxi/ 推荐查看天气:https://www.40tianqi.com/tunxi/zuotian.html 推荐查看天气:https://www.40tianqi.com/tunxi/7tian.html 推荐查看天气:https://www.40tianqi.com/tunxi/10tian.html 推荐查看天气:https://www.40tianqi.com/tunxi/15tian.html 推荐查看天气:https://www.40tianqi.com/tunxi/40tian.html 推荐查看天气:https://www.40tianqi.com/huangshanqu/ 推荐查看天气:https://www.40tianqi.com/huangshanqu/zuotian.html 推荐查看天气:https://www.40tianqi.com/huangshanqu/7tian.html 推荐查看天气:https://www.40tianqi.com/huangshanqu/10tian.html 推荐查看天气:https://www.40tianqi.com/huangshanqu/15tian.html 推荐查看天气:https://www.40tianqi.com/huangshanqu/40tian.html 推荐查看天气:https://www.40tianqi.com/xiexian/ 推荐查看天气:https://www.40tianqi.com/xiexian/zuotian.html 推荐查看天气:https://www.40tianqi.com/xiexian/7tian.html 推荐查看天气:https://www.40tianqi.com/xiexian/10tian.html 推荐查看天气:https://www.40tianqi.com/xiexian/15tian.html 推荐查看天气:https://www.40tianqi.com/xiexian/40tian.html 推荐查看天气:https://www.40tianqi.com/xiuning/ 推荐查看天气:https://www.40tianqi.com/xiuning/zuotian.html 推荐查看天气:https://www.40tianqi.com/xiuning/7tian.html 推荐查看天气:https://www.40tianqi.com/xiuning/10tian.html 推荐查看天气:https://www.40tianqi.com/xiuning/15tian.html 推荐查看天气:https://www.40tianqi.com/xiuning/40tian.html 推荐查看天气:https://www.40tianqi.com/yixian/ 推荐查看天气:https://www.40tianqi.com/yixian/zuotian.html 推荐查看天气:https://www.40tianqi.com/yixian/7tian.html 推荐查看天气:https://www.40tianqi.com/yixian/10tian.html 推荐查看天气:https://www.40tianqi.com/yixian/15tian.html 推荐查看天气:https://www.40tianqi.com/yixian/40tian.html 推荐查看天气:https://www.40tianqi.com/qimen/ 推荐查看天气:https://www.40tianqi.com/qimen/zuotian.html 推荐查看天气:https://www.40tianqi.com/qimen/7tian.html 推荐查看天气:https://www.40tianqi.com/qimen/10tian.html 推荐查看天气:https://www.40tianqi.com/qimen/15tian.html 推荐查看天气:https://www.40tianqi.com/qimen/40tian.html 推荐查看天气:https://www.40tianqi.com/chuzhou/ 推荐查看天气:https://www.40tianqi.com/chuzhou/zuotian.html 推荐查看天气:https://www.40tianqi.com/chuzhou/7tian.html 推荐查看天气:https://www.40tianqi.com/chuzhou/10tian.html 推荐查看天气:https://www.40tianqi.com/chuzhou/15tian.html 推荐查看天气:https://www.40tianqi.com/chuzhou/40tian.html 推荐查看天气:https://www.40tianqi.com/langya/ 推荐查看天气:https://www.40tianqi.com/langya/zuotian.html 推荐查看天气:https://www.40tianqi.com/langya/7tian.html 推荐查看天气:https://www.40tianqi.com/langya/10tian.html 推荐查看天气:https://www.40tianqi.com/langya/15tian.html 推荐查看天气:https://www.40tianqi.com/langya/40tian.html 推荐查看天气:https://www.40tianqi.com/nanqiao/ 推荐查看天气:https://www.40tianqi.com/nanqiao/zuotian.html 推荐查看天气:https://www.40tianqi.com/nanqiao/7tian.html 推荐查看天气:https://www.40tianqi.com/nanqiao/10tian.html 推荐查看天气:https://www.40tianqi.com/nanqiao/15tian.html 推荐查看天气:https://www.40tianqi.com/nanqiao/40tian.html 推荐查看天气:https://www.40tianqi.com/laian/ 推荐查看天气:https://www.40tianqi.com/laian/zuotian.html 推荐查看天气:https://www.40tianqi.com/laian/7tian.html 推荐查看天气:https://www.40tianqi.com/laian/10tian.html 推荐查看天气:https://www.40tianqi.com/laian/15tian.html 推荐查看天气:https://www.40tianqi.com/laian/40tian.html 推荐查看天气:https://www.40tianqi.com/quanjiao/ 推荐查看天气:https://www.40tianqi.com/quanjiao/zuotian.html 推荐查看天气:https://www.40tianqi.com/quanjiao/7tian.html 推荐查看天气:https://www.40tianqi.com/quanjiao/10tian.html 推荐查看天气:https://www.40tianqi.com/quanjiao/15tian.html 推荐查看天气:https://www.40tianqi.com/quanjiao/40tian.html 推荐查看天气:https://www.40tianqi.com/dingyuan/ 推荐查看天气:https://www.40tianqi.com/dingyuan/zuotian.html 推荐查看天气:https://www.40tianqi.com/dingyuan/7tian.html 推荐查看天气:https://www.40tianqi.com/dingyuan/10tian.html 推荐查看天气:https://www.40tianqi.com/dingyuan/15tian.html 推荐查看天气:https://www.40tianqi.com/dingyuan/40tian.html 推荐查看天气:https://www.40tianqi.com/fengyang/ 推荐查看天气:https://www.40tianqi.com/fengyang/zuotian.html 推荐查看天气:https://www.40tianqi.com/fengyang/7tian.html 推荐查看天气:https://www.40tianqi.com/fengyang/10tian.html 推荐查看天气:https://www.40tianqi.com/fengyang/15tian.html 推荐查看天气:https://www.40tianqi.com/fengyang/40tian.html 推荐查看天气:https://www.40tianqi.com/tianchang/ 推荐查看天气:https://www.40tianqi.com/tianchang/zuotian.html 推荐查看天气:https://www.40tianqi.com/tianchang/7tian.html 推荐查看天气:https://www.40tianqi.com/tianchang/10tian.html 推荐查看天气:https://www.40tianqi.com/tianchang/15tian.html 推荐查看天气:https://www.40tianqi.com/tianchang/40tian.html 推荐查看天气:https://www.40tianqi.com/mingguang/ 推荐查看天气:https://www.40tianqi.com/mingguang/zuotian.html 推荐查看天气:https://www.40tianqi.com/mingguang/7tian.html 推荐查看天气:https://www.40tianqi.com/mingguang/10tian.html 推荐查看天气:https://www.40tianqi.com/mingguang/15tian.html 推荐查看天气:https://www.40tianqi.com/mingguang/40tian.html 推荐查看天气:https://www.40tianqi.com/fuyang/ 推荐查看天气:https://www.40tianqi.com/fuyang/zuotian.html 推荐查看天气:https://www.40tianqi.com/fuyang/7tian.html 推荐查看天气:https://www.40tianqi.com/fuyang/10tian.html 推荐查看天气:https://www.40tianqi.com/fuyang/15tian.html 推荐查看天气:https://www.40tianqi.com/fuyang/40tian.html 推荐查看天气:https://www.40tianqi.com/yingzhou/ 推荐查看天气:https://www.40tianqi.com/yingzhou/zuotian.html 推荐查看天气:https://www.40tianqi.com/yingzhou/7tian.html 推荐查看天气:https://www.40tianqi.com/yingzhou/10tian.html 推荐查看天气:https://www.40tianqi.com/yingzhou/15tian.html 推荐查看天气:https://www.40tianqi.com/yingzhou/40tian.html 推荐查看天气:https://www.40tianqi.com/yingdong/ 推荐查看天气:https://www.40tianqi.com/yingdong/zuotian.html 推荐查看天气:https://www.40tianqi.com/yingdong/7tian.html 推荐查看天气:https://www.40tianqi.com/yingdong/10tian.html 推荐查看天气:https://www.40tianqi.com/yingdong/15tian.html 推荐查看天气:https://www.40tianqi.com/yingdong/40tian.html 推荐查看天气:https://www.40tianqi.com/yingquan/ 推荐查看天气:https://www.40tianqi.com/yingquan/zuotian.html

优秀的个人博客,低调大师

前端 JavaScript 获取字符串中重复次数最多的字符

问渠那得清如许,为有源头活水来。 想要保持自己的技术活力,最有效的手段就是通过不断地输入来提供足够的养分。我们也不必刻意追求高深的或者新鲜的知识点,通过对一个基础问题的全方位多维度解析,同样也会收获不小。 题目 假设有这么一道题目:请获取字符串 "bianchengsanmei,xuexiyouqudezhishi,jieshiyouqudepengyou,suzaoyouqudelinghun." 中重复次数最多的字符及其重复次数。 今天我们就来解一下这道题。 分析 这种题目的解法比较开放,实现手段也可能多种多样,其中的区别在于代码的运行性能有高有低(时间复杂度和空间复杂度不同)。 在这里需要注意的只有一点:符合最大次数的字符可能不止一个。 使用对象 解题思路: 遍历字符串,以各个字符为 key,重复次数为 value,存入一个对象。 遍历对象,得到 value 的最大值。 遍历对象,根据得到的最大 value 值,获取到对应的字符 key。 输出结果。 代码实现如下: const testStr = "bianchengsanmei,xuexiyouqudezhishi,jieshiyouqudepengyou,suzaoyouqudelinghun.ii"; // 获取各个字符及其重复次数的映射对象 let wordsObj = {}; for (let index = 0; index < testStr.length; index++) { const word = testStr[index]; word in wordsObj ? wordsObj[word]++ : wordsObj[word] = 1; } // 获取最大的重复次数 let maxNum = 0; for (const word in wordsObj) { const num = wordsObj[word]; if (num >= maxNum) { maxNum = num; } } // 获取最大重复次数对应的字符,并输出结果 for (const word in wordsObj) { const num = wordsObj[word]; if (num === maxNum) { console.log(`重复次数最多的字符是:${ word },重复次数为:${ maxNum }`) } } // 出现次数最多的字符是:i,出现次数为:10 // 出现次数最多的字符是:u,出现次数为:10 分析: 这应该是很多人第一时间能够想到的解法,很符合“面向过程”的编程思想。 总共有三个循环,存在较大的优化空间。 数组&指针 解题思路: 将字符串转为数组并排序,使重复字符排在一起。 使用指针思想,得到最大重复次数和对应的字符数组。 输出结果。 代码实现如下: const testStr = "bianchengsanmei,xuexiyouqudezhishi,jieshiyouqudepengyou,suzaoyouqudelinghun.ii"; // 将字符串转为数组并排序 const testStrArr = testStr.split("").sort(); let startIndex = 0; let endIndex = 1; let maxNum = 0; let validWords = []; // 使用指针法,获取最大重复次数及最大次数对应的字符数组 while (startIndex < testStrArr.length) { // startIndex 和 endIndex 位置的字符不同 if (testStrArr[startIndex] !== testStrArr[endIndex]) { // 计算 startIndex 和 endIndex 之间的字符个数 const rangeNum = endIndex - startIndex; if (rangeNum > maxNum) { maxNum = rangeNum; // 如果出现了新的最大次数,则给存放符合条件字符的数组重新赋值 validWords = [testStrArr[startIndex]]; } else if (rangeNum === maxNum) { // 如果新的次数和最大次数相等,则将该字符 push 进字符数组 validWords.push(testStrArr[startIndex]); } startIndex = endIndex; } endIndex++; } // 打印结果 for (let index = 0; index < validWords.length; index++) { const word = validWords[index]; console.log(`重复次数最多的是:${ word },重复次数为:${ maxNum }`) } 分析: 本方法的难点和精髓在于使用了指针法,一次循环就获取到了我们想要的结果。 总结 主流的解题思路大概就这两种,其他的很多解法都可以看作是这两种思路的变种。 万变不离其宗,只要将解题思路理清了,代码实现只是一个结果而已。在平常的工作学习中,我们要有意识地培养自己的发散性思维,从多角度去看待问题,你可能会发现不一样的风景哦! 希望能够对大家有所启发哦! ~ ~ 本文完,感谢阅读! ~ 学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂! 我是〖编程三昧〗的作者 隐逸王,我的公众号是『编程三昧』,欢迎关注,希望大家多多指教! 你来,怀揣期望,我有墨香相迎! 你归,无论得失,唯以余韵相赠! 知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册