作为基于@Ibu(当前已接受且完全有效)答案的更“最新”方法,您可以使用forEach method in JavaScript,如下所示:
let select_elem = document.createElement('select');
langArray.forEach((element, index) => {
let option_elem = document.createElement('option');
// Add index to option_elem
option_elem.value = index;
// Add element HTML
option_elem.textContent = element;
// Append option_elem to select_elem
select_elem.appendChild(option_elem);
});
使用forEach 方法跟踪它自己的索引,这意味着您不需要手动跟踪您的索引(使用类似var i=0; [...] i++ 的东西)而且——我认为——比@987654329 更整洁、更易于维护@ 环形。毕竟,您不需要在循环之外创建任何变量,或者手动增加这些变量,因此,如果索引变量(例如,var i)在其他地方使用(例如,如果你在一个循环中有一个循环)。
应该注意,此建议是在上下文中提出的 - 当for 循环是最佳选择,而forEach 循环将是最佳选择时,最终会有上下文。由于我个人优先考虑可维护性而不是速度,因此默认情况下我会选择forEach 循环。但这并不是说它是正确的或唯一正确的答案。始终、始终、始终考虑您的个人使用要求,而不是 Internet 上任何人的建议。
我还把innerHTML 换成了textContent。最终,选项中的内容将始终是文本(您不能将 HTML 添加到选项中),因此使用 textContent 更能描述您最终将要做的事情。而且textContent 比innerHTML 性能更高,因为它不解析输入的数据。事实上,基准测试表明,只需将innerHTML 更改为textContent 即可improve performance by over x2.5。
因此,对于将来阅读您的代码的人来说,这可能会提高性能和。在这种情况下,与for 循环不同,我认为不 使用textContent 而不是innerHTML 没有任何好处。
性能
需要注意的一点是for-in 循环比forEach 循环的性能更高。虽然这有点微不足道(特别是考虑到上下文),但在我看来,您应该始终优先考虑可维护性而不是单纯的速度......除非性能是您所做工作的重要标准(例如,如果您正在迭代超过 1000 次)值的定期和遇到瓶颈)。还是那句老话,“过早的优化是万恶之源”。
最终,JS 的维护者将努力提高最常用构造的性能,并且在大多数情况下,性能影响可以忽略不计,并且随着设备变得更强大和解析器越来越优化,可能会随着时间的推移而降低。
然而,一个不容易维护的应用程序的性能确实可能非常高。并且只会上升,因为随着时间的推移,可维护性差会导致更多的错误被引入。现在将循环缩短 0.002 毫秒不会对未来产生任何明显的影响。未来的开发人员尝试将 <strong> 标记添加到 <option> 元素,因为他们阅读了 innerHTML = ... 并假设他们可以添加 HTML 将对未来产生影响。
旧版浏览器的附注
forEach 方法适用于所有evergreen browsers,但不适用于 IE11 或更低版本。为此,您需要 polyfill 或使用 Babel 之类的服务将代码编译为 ES6 之前的格式。
对于旧版浏览器,您可能还需要将 let 关键字更改为 var。 let 关键字确实在 IE11 中工作,尽管它有许多问题。如果您不需要支持旧版浏览器,那么使用关键字let 和const 是很好的习惯。