如何将令人烦恼的“for”循环转换为“Object.keys”例程或类似程序(JSLint)
Posted
技术标签:
【中文标题】如何将令人烦恼的“for”循环转换为“Object.keys”例程或类似程序(JSLint)【英文标题】:How to translate vexing 'for' loop into 'Object.keys' routine or similar (JSLint) 【发布时间】:2016-05-13 10:43:18 【问题描述】:我正在尝试遵循 JSLint 的“最佳实践”,它不鼓励使用 for
循环,推荐使用 Object.keys
和类似的替代方法。大多数for
循环都可以通过forEach
轻松转换为Object.keys
,如下所示:
Object.keys(object).forEach(function (key)
等等
还有一个真实世界的例子:
var elems = document.getElementsByClassName('myClass');
Object.keys(elems).forEach(function (key)
elems[key].style.display = 'block';
elems[key].style.visibility = 'visible';
);
但是,我对如何将以下例程转换为不使用标准 for
循环的形式感到困惑。
var selection = window.getSelection();
var htmlDiv = document.createElement("div");
var i;
for (i = 0; i < selection.rangeCount; ++i)
htmlDiv.appendChild(selection.getRangeAt(i).cloneContents());
我不需要遍历window.getSelection()
;我需要使用window.getSelection()
的原生getRangeAt()
函数按范围抓取文本。
任何线索如何在不使用上述标准for
循环的情况下执行此操作?
【问题讨论】:
等等,什么?? JSLint 是说使用Object.keys
而不是普通的for
循环?因为Object.keys
性能更高?这没有任何意义。
可以用while
循环代替for
循环,或者使用Array.prototype.forEach()
是的,JSLint 不鼓励“for”循环,并提供了一个基本原理。见:jslint.com/help.html#for
【参考方案1】:
好吧,我将成为猴子的叔叔。被 JSLint 用 'Object.keys' 代替 'for' 的处方误导(参见:jslint.com/help.html#for),@guest271314 建议使用简单的 'while' 循环成功并通过了 JSLint 的标准:
while (i < selection.rangeCount)
htmlDiv.appendChild(selection.getRangeAt(i).cloneContents());
i += 1;
JSLint 也坚持 'i += 1;'而不是i++;
并提供了一个基本原理(参见http://www.jslint.com/help.html#inc)。但是他们没有解释为什么while
循环与“for”循环相比是可以的;有人愿意推测吗?
【讨论】:
以上是关于如何将令人烦恼的“for”循环转换为“Object.keys”例程或类似程序(JSLint)的主要内容,如果未能解决你的问题,请参考以下文章