index.original.js 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. // @flow
  2. module.exports = function shallowEqual<T, U>(
  3. objA?: ?T,
  4. objB?: ?U,
  5. compare?: ?(objValue: any, otherValue: any, key?: string) => boolean | void,
  6. compareContext?: ?any
  7. ): boolean {
  8. var ret = compare ? compare.call(compareContext, objA, objB) : void 0;
  9. if (ret !== void 0) {
  10. return !!ret;
  11. }
  12. if (objA === objB) {
  13. return true;
  14. }
  15. if (typeof objA !== "object" || !objA || typeof objB !== "object" || !objB) {
  16. return false;
  17. }
  18. var keysA = Object.keys(objA);
  19. var keysB = Object.keys(objB);
  20. if (keysA.length !== keysB.length) {
  21. return false;
  22. }
  23. var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);
  24. // Test for A's keys different from B.
  25. for (var idx = 0; idx < keysA.length; idx++) {
  26. var key = keysA[idx];
  27. if (!bHasOwnProperty(key)) {
  28. return false;
  29. }
  30. var valueA = objA[key];
  31. var valueB = objB[key];
  32. ret = compare ? compare.call(compareContext, valueA, valueB, key) : void 0;
  33. if (ret === false || (ret === void 0 && valueA !== valueB)) {
  34. return false;
  35. }
  36. }
  37. return true;
  38. };