Is a plain for loop with a counter significantly faster than a forEach? With Object.keys I've been enjoying the simplicity of statements like
Object.keys(obj).forEach(function (key) {
console.log(obj[key]);
});
but does that hamstring my performance?Your mileage will vary depending on the browser. If you really care (as in profiling identified this as a hotspot) you should measure the alternatives you're considering.
But note that in your specific case chances are the cost of a bunch of console.log() calls completely swamps the cost of either a for loop or a forEach call. console.log() has _incredibly_ complicated behavior.
A native counter for-loop will always be faster: http://jsperf.com/angular-foreach-vs-native-for-loop/13
Re:V8 Optimization Killers
by Alphasite_ on Wednesday June 25, 2014 @11:10AM
(#7944424)
Is that (#2) defined behaviour, or is it undefined? Because iirc, other languages disallow it for similar reasons.
Adding properties is undefined in ES5 and I believe defined in ES6.
Deleting properties is guaranteed to not break iteration and deleting an as-of-yet unvisited property causes it to never be visited.
Re:V8 Optimization Killers
by general_failure on Wednesday June 25, 2014 @11:31AM
(#7944563)
Object.keys() does not need to malloc() ?
1. In a for..in loop the engine must keep track of the keys already iterated over, whereas in the fast version we can simply increment a counter and do a fast array lookup.
2. It's possible to add properties to the object that you're iterating within the body of the for..in statement, and these will be iterated too. Doing such a thing is obviously very rare but it's the kind of edge case the JS engine must keep track of.