更高的性能 - Map.prototype.forEach 还是 for..of?

5 javascript dictionary node.js es6-map

假设我有:

const m = new Map();
Run Code Online (Sandbox Code Playgroud)

两者之间是否存在性能差异:

for(let v of m){

}
Run Code Online (Sandbox Code Playgroud)

m.forEach(v => {});
Run Code Online (Sandbox Code Playgroud)

我假设Map.protoype.forEach使用迭代器就像 for..of 一样?我在这里读到,在迭代期间使用 for..of 从映射中删除键是安全的,请参阅:ES6:在 Set/Map 迭代期间从 Set/Map 中删除元素是否危险?

我想知道用循环从地图中删除键是否安全Map.prototype.forEach

Ale*_*aru 0

在 Node.js 8.11 上使用以下代码进行了一些基准测试

\n\n
const Benchmark = require('benchmark');\nconst suite = new Benchmark.Suite();\n\nsuite\n  .add('for of', function () {\n    const m = new Map();\n    for (let i = 0; i < 100; i++) {\n      m.set(`key${i}`, i);\n    }\n\n    for (let v of m) {\n      m.delete(v);\n    }\n  })\n  .add('forEach', function () {\n    const m = new Map();\n    for (let i = 0; i < 100; i++) {\n      m.set(`key${i}`, i);\n    }\n\n    m.forEach(v => {\n      m.delete(v);\n    })\n  })\n  .on('cycle', function (event) {\n    console.log(String(event.target));\n  })\n  .on('complete', function () {\n    console.log('Fastest is ' + this.filter('fastest').map('name'));\n  })\n  // run async\n  .run({ 'async': true });\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果非常有趣:

\n\n
for of x 88,105 ops/sec \xc2\xb10.36% (89 runs sampled)\nforEach x 81,532 ops/sec \xc2\xb10.55% (90 runs sampled)\nFastest is for of\n
Run Code Online (Sandbox Code Playgroud)\n