Object.keys(obj) : Array
ruft alle string-bewerteten Schlüssel aller aufzählbaren eigenen (nicht vererbten) Eigenschaften ab.
Es ergibt sich also die gleiche Liste von Schlüsseln, wie Sie sie beabsichtigen, indem Sie jeden Objektschlüssel mit hasOwnProperty testen. Sie brauchen diese zusätzliche Testoperation nicht als und Object.keys( obj ).forEach(function( key ){})
soll schneller sein. Beweisen wir es:
var uniqid = function(){
var text = "",
i = 0,
possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
for( ; i < 32; i++ ) {
text += possible.charAt( Math.floor( Math.random() * possible.length ) );
}
return text;
},
CYCLES = 100000,
obj = {},
p1,
p2,
p3,
key;
// Populate object with random properties
Array.apply( null, Array( CYCLES ) ).forEach(function(){
obj[ uniqid() ] = new Date()
});
// Approach #1
p1 = performance.now();
Object.keys( obj ).forEach(function( key ){
var waste = obj[ key ];
});
p2 = performance.now();
console.log( "Object.keys approach took " + (p2 - p1) + " milliseconds.");
// Approach #2
for( key in obj ) {
if ( obj.hasOwnProperty( key ) ) {
var waste = obj[ key ];
}
}
p3 = performance.now();
console.log( "for...in/hasOwnProperty approach took " + (p3 - p2) + " milliseconds.");
In meinem Firefox habe ich folgende Ergebnisse
- Object.keys brauchte 40,21101451665163 Millisekunden.
- for...in/hasOwnProperty-Ansatz dauerte 98,26163508463651 Millisekunden.
PS. auf Chrome ist der Unterschied noch größer http://codepen.io/dsheiko/pen/JdrqXa
PS2: In ES6 (EcmaScript 2015) kann man iterierbare Objekte besser iterieren:
let map = new Map().set('a', 1).set('b', 2);
for (let pair of map) {
console.log(pair);
}
// OR
let map = new Map([
[false, 'no'],
[true, 'yes'],
]);
map.forEach((value, key) => {
console.log(key, value);
});