这是将数组的值恢复为简单的true
或false
值的最佳方法。
我很困惑,因为jsperf给我非常的结果与Google chrome控制台,nodejs或任何其他JS引擎给我的结果不同。 (jsperf snippet here)
这是代码段,您可以看到(可以在此处运行)some
比使用foreach
循环快100倍
var array = [];
var i = 0;
var flag = false;
while (i< 100000) {
array.push(Math.random()*10000);
i++;
}
console.time('forEach');
array.forEach((item) => {
if (!flag && item > 10000/2) {
flag = true;
return;
}
return false
});
console.timeEnd('forEach');
console.log(flag);
flag = false;
console.time('some');
flag = array.some((item) => {
if (item > 10000/2) {
return true;
}
return false
});
console.timeEnd('some');
console.log(flag);
问题是,为什么JSPERF给出的结果与chrome的控制台,nodejs或任何其他JS引擎不同?
编辑: 正如我对下面问题的回答所指出的那样,该行为是有问题的,因为在使用JSPERF时我打开了chrome开发工具,并且所有消息都已记录到控制台,这意味着实际上结果改变了。 请牢记将来,JSPERF在执行中保持打开控制台状态时可能无法正常工作。
答案 0 :(得分:7)
来自MDN
除了通过以下方式之外,没有其他方法可以停止或中断forEach()循环: 引发异常。
使用[Test]
[TestCase(1234)]
[TestCase(5678)]
[TestCase(7654)]
public void TestSelect(int id)
{
DataTable old = Database.call("old_stored_proc", id);
DataTable new_ = Database.call("new_stored_proc", id);
Assert.AreEqual(old.Rows[0]["column"], new_.Rows[0]["column"]);
}
,该循环将精确执行100000次。
使用foreach
,一旦您的谓词返回true,循环就会停止。
只要您的谓词为真,some
就会更有效率
答案 1 :(得分:0)