Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么内置函数调用(如map、forEach等)比Javascript中的常规循环(for、while…)慢?_Javascript_Ecmascript 6 - Fatal编程技术网

为什么内置函数调用(如map、forEach等)比Javascript中的常规循环(for、while…)慢?

为什么内置函数调用(如map、forEach等)比Javascript中的常规循环(for、while…)慢?,javascript,ecmascript-6,Javascript,Ecmascript 6,我在读《雄辩的Javascript》一书,该书的作者Marjin Haverbeke指出,内置函数调用比常规的for或while循环运行得慢,但这是为什么呢 编辑:his与此相关,也对此有帮助。您列出的(map,forEach)调用函数。所以比较 const updated = original.map(e => e * 2); 到 …为每个循环迭代创建一个不同的i(因此,在循环中创建的闭包可以在每个循环中关闭,而不会出现闭包在循环中的问题)。可能的重复有很多重复,因为这已经被讨论了很多

我在读《雄辩的Javascript》一书,该书的作者Marjin Haverbeke指出,内置函数调用比常规的for或while循环运行得慢,但这是为什么呢

编辑:his与此相关,也对此有帮助。

您列出的(
map
forEach
调用函数。所以比较

const updated = original.map(e => e * 2);


…为每个循环迭代创建一个不同的
i
(因此,在循环中创建的闭包可以在每个循环中关闭,而不会出现闭包在循环中的问题)。

可能的重复有很多重复,因为这已经被讨论了很多次。我知道我见过至少5个这样的问题/答案,但我现在似乎找不到一个好的来标记dup。就在昨天,甚至还有一个。有时很难在堆栈溢出搜索中找到东西,但事实上它们并不是完全相同的different@jfriend00这当然是因为没有绝对的答案,因为(从SO和其他网站上我们可以看到)这取决于您的环境和您必须处理的数据。@Scraappy-现代JS引擎优化了
for
循环,因此它几乎总是比
.forEach()
循环快得多,因为
.forEach()
循环在循环的每次迭代中都有函数调用和函数范围对象的开销,而
for
循环则没有。我认为这不再取决于环境
.map()
的作用不同于普通的
for
循环(它创建了一个新数组),因此它具有不同的功能。如果您愿意,您可以在
for
循环中重新实现自己,但通常这只是浪费代码,而不是使用已经运行的代码。因此,问题是关于性能,但您的答案中没有提供任何性能度量?另外,这不是有很多重复吗?@jfriend00:我认为这个问题不需要测量,尤其是因为哈弗贝克大概已经在书中证明了这一点。而且,我找不到一个好的受骗者,尽管像你一样,我很难相信没有一个。:-)(我是说,这是个好主意。)@Scraappy:是的,我应该对优化发表意见(现在我已经发表了意见)。JavaScript引擎可以优化一些琐碎示例的函数调用(如上面我的示例)。例如,在你的基准测试中,Chrome可以,Firefox可以,Edge不能(或者至少不足以让它比
for
循环更快)。
const updated = [];
let i; // (Declaring these here is a premature micro-optimization¹ for effect)
const len = original.length;
for (i = 0; i < len; ++i) {
    updated[i] = original[i] * 2;
}
const updated = [];
for (let i = 0, len = original.length; i < len; ++i) {
    updated[i] = original[i] * 2;
}