答案 0 :(得分:20)
看了ECMA-262之后。看起来本机实现只是在错误处理和功能方面比简单的自我实现更多。
例如,在MDN上查看map
的polyfill实现:Array.prototype.map()。它基于ECMA-262中指定的相同算法。现在更新您的示例以使用此算法可以使本机实现更快 - 尽管只是略微:map-native-vs-implemented。
此外,map
可能不是最好的测试示例,因为它在本机代码和提供的lambda函数之间来回反复。
我原本希望本地concat
函数具有更好的性能。然而,看看ECMA-262,我们也可以看到做更多。查看第15.4.4.4节中的算法,我们可以看到它处理了一些额外的情况。例如,组合多个参数 - 一些是数组,一些是其他类型:
[1, 2, 3].concat([4, 5, 6], "seven", 8, [9, 10]);
返回
[1, 2, 3, 4, 5, 6, "seven", 8, 9, 10]
最后要注意的是,这些都是非常基本的算法。当在大型数据集上运行这样的算法,或者连续数千次运行时,看起来一个比另一个快得多。但是,在数千次迭代中执行甚至几次额外的安全检查可能会使一种算法明显慢于不执行这些检查的算法。计算计算操作 - 如果你的额外错误处理和功能使循环中的代码行加倍,那么它自然会变慢。