@samitouri / QOS-React-2 / commits / d2bb4728f0

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