如何以最‘纯JavaScript’方式编写函数以缩短执行时间?
纯JavaScript优化语言检测与翻译函数的方案
嘿,我来帮你梳理下怎么用最纯粹的JS方式优化这个语言检测和翻译逻辑,同时大幅缩短执行时间~先拆解原代码里的可优化点,再给出改进后的完整实现:
1. 预处理支持语言集合,提升查找效率
原代码用数组AcceptLngs做语言匹配检查,数组的includes/indexOf是O(n)时间复杂度,换成Set的话,查找速度直接变成O(1),在语言列表较长时优势特别明显。如果需要处理带地区的语言(比如en-US匹配en),还可以额外加一个降级映射表。
// 预处理支持的语言为Set,快速查找 const supportedLngs = new Set(['de', 'en', 'es', 'fr', 'it', 'pt', 'pt-BR']); // 自定义语言降级规则(比如带地区的语言映射到基础语言) const lngFallbackMap = { 'en-US': 'en', 'pt-PT': 'pt', // 按需添加其他规则 };
2. 优化浏览器语言检测逻辑,减少冗余计算
原代码的语言检测逻辑可以更简洁,同时加入语言降级处理(很多浏览器返回带地区的语言码),而且用闭包缓存检测结果——浏览器语言不会频繁变化,没必要每次调用都重新读取浏览器属性。
// 用闭包缓存检测结果,避免重复计算 const getPreferredLng = (() => { let cachedLng; return () => { if (cachedLng) return cachedLng; const nav = window.navigator; // 按优先级收集所有可能的语言选项 const possibleLngs = [ ...(nav.languages || []), nav.language, nav.browserLanguage, nav.userLanguage ]; // 遍历匹配,找到第一个支持的语言就终止循环 for (const lng of possibleLngs) { if (!lng) continue; // 跳过空值 // 先匹配完整语言码 if (supportedLngs.has(lng)) { cachedLng = lng; return cachedLng; } // 匹配去掉地区的基础语言码(比如en-US → en) const baseLng = lng.split('-')[0]; if (supportedLngs.has(baseLng)) { cachedLng = baseLng; return cachedLng; } // 匹配自定义降级规则 if (lngFallbackMap[lng] && supportedLngs.has(lngFallbackMap[lng])) { cachedLng = lngFallbackMap[lng]; return cachedLng; } } // 没有匹配到则用默认语言 cachedLng = 'en'; return cachedLng; }; })();
3. 简化翻译查找逻辑,减少属性访问冗余
原代码的_getI18N结构保持不变,但用可选链操作符?.简化存在性判断,同时优先使用缓存的语言结果,避免重复检测:
// 翻译函数 const translate = (wordKey) => { const lng = getPreferredLng(); // 优先取当前语言翻译,没有则回退到默认语言,最后返回原键值 return _getI18N[wordKey]?.[lng] || _getI18N[wordKey]?.['en'] || wordKey; };
整合后的完整优化代码
把上面的部分整合起来,就是一个高效、纯JS的实现:
// 配置区 const supportedLngs = new Set(['de', 'en', 'es', 'fr', 'it', 'pt', 'pt-BR']); const lngFallbackMap = { 'en-US': 'en', 'pt-PT': 'pt', }; const _getI18N = { 'wordToTranslate': { 'pt': 'translatedWord', 'en': 'Word to Translate', /*...*/ }, '2ndWordToTranslate': { 'pt-BR': 'translatedWord', 'en': 'Second Word to Translate', /*...*/ } }; // 缓存语言检测结果的闭包函数 const getPreferredLng = (() => { let cachedLng; return () => { if (cachedLng) return cachedLng; const nav = window.navigator; const possibleLngs = [ ...(nav.languages || []), nav.language, nav.browserLanguage, nav.userLanguage ]; for (const lng of possibleLngs) { if (!lng) continue; if (supportedLngs.has(lng)) { cachedLng = lng; return cachedLng; } const baseLng = lng.split('-')[0]; if (supportedLngs.has(baseLng)) { cachedLng = baseLng; return cachedLng; } if (lngFallbackMap[lng] && supportedLngs.has(lngFallbackMap[lng])) { cachedLng = lngFallbackMap[lng]; return cachedLng; } } cachedLng = 'en'; return cachedLng; }; })(); // 翻译函数 const translate = (wordKey) => { const lng = getPreferredLng(); return _getI18N[wordKey]?.[lng] || _getI18N[wordKey]?.['en'] || wordKey; }; // 使用示例 console.log(translate('wordToTranslate'));
优化后的核心效率提升点
- 语言检测仅执行一次,结果永久缓存,后续调用直接取缓存值
- 支持语言用Set存储,查找从O(n)优化为O(1)
- 语言检测循环提前终止,找到匹配项立刻返回,无需遍历所有可能
- 翻译查找用可选链简化逻辑,减少冗余的存在性判断
内容的提问来源于stack exchange,提问作者K-mikaZ
相关产品推荐
相关产品推荐

