6 ms·
`for ... in` is a relatively slow construct anyway, the faster option (a lot more verbose) is: var keys = Object.keys(obj), length = keys.length,
by phpnode 12y ago
`for ... in` is a relatively slow construct anyway, the faster option (a lot more verbose) is:
var keys = Object.keys(obj),
length = keys.length,
key, i;
for (i = 0; i < length; i++) {
key = keys[i];
}
While this is not exactly the same as for..in, it usually behaves how you'd expect and is significantly faster for a couple of reasons:
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.
- Alphasite_ 12y agoIs that (#2) defined behaviour, or is it undefined? Because iirc, other languages disallow it for similar reasons.
- gsnedders 12y agoAdding 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.
- general_failure 12y agoObject.keys() does not need to malloc() ?
- kipple 12y agoIs 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?
- bzbarsky 12y agoYour 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.
- ekmartin 12y agoA native counter for-loop will always be faster: http://jsperf.com/angular-foreach-vs-native-for-loop/13 http://jsperf.com/angular-foreach-vs-native-for-loop/13
- kevingadd 12y agoKeys is an alloc. That is not 'faster'.