Increase speed of shallowEqual
All testes successfully completed. - for-in in browsers is slow, i replaced him by Object.keys + for(array) - simple check of lengths let us not iterate if not same - now we dont need to test for B's keys missing from A, because if length's is same and prev check success - objB hasn't more keys - micro optimize: calling objB.hasOwnProperty - micro optimize: replaced !objA || !obj for more speedy check === null #inspiredby https://github.com/jurassix/react-immutable-render-mixin/pull/4
Murad committed
Apr 2, 2015 at 23:43 UTC
d2bb4728f08ad168997a7928f7b9a4cab8116bce
1 file changed
+12
-14
src/utils/shallowEqual.js
+12
-14
@@ -23,28 +23,26 @@ function shallowEqual(objA, objB) {
23
return true;
24
}
25
26
- if (!objA || !objB) {
26
+ if (typeof objA !== 'object' || objA === null
27
+ || typeof objB !== 'object' || objB === null) {
28
return false;
29
}
29
-
30
- if (typeof objA !== 'object' || typeof objB !== 'object') {
30
+
31
+ var keysA = Object.keys(objA),
32
+ keysB = Object.keys(objB);
33
+
34
+ if(keysA.length !== keysB.length) {
35
return false;
36
}
33
-
34
- var key;
37
+
38
// Test for A's keys different from B.
36
- for (key in objA) {
37
- if (objA.hasOwnProperty(key) &&
38
- (!objB.hasOwnProperty(key) || objA[key] !== objB[key])) {
39
- return false;
40
- }
41
- }
42
- // Test for B's keys missing from A.
43
- for (key in objB) {
44
- if (objB.hasOwnProperty(key) && !objA.hasOwnProperty(key)) {
39
+ var bHasOwnProperty = objB.hasOwnProperty.bind(objB);
40
+ for(var i = 0, length = keysA.length; i < length; i++) {
41
+ if (!bHasOwnProperty(keysA[i]) || objA[keysA[i]] !== objB[keysA[i]] ) {
42
return false;
43
}
44
}
45
+
46
return true;
47
}
48