AbstractEqualityComparison.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. 'use strict';
  2. var ToNumber = require('./ToNumber');
  3. var ToPrimitive = require('./ToPrimitive');
  4. var Type = require('./Type');
  5. var isObject = require('../helpers/isObject');
  6. // https://262.ecma-international.org/6.0/#sec-abstract-equality-comparison
  7. module.exports = function AbstractEqualityComparison(x, y) {
  8. if (Type(x) === Type(y)) {
  9. return x === y; // ES6+ specified this shortcut anyways.
  10. }
  11. if (x == null && y == null) {
  12. return true;
  13. }
  14. if (typeof x === 'number' && typeof y === 'string') {
  15. return AbstractEqualityComparison(x, ToNumber(y));
  16. }
  17. if (typeof x === 'string' && typeof y === 'number') {
  18. return AbstractEqualityComparison(ToNumber(x), y);
  19. }
  20. if (typeof x === 'boolean') {
  21. return AbstractEqualityComparison(ToNumber(x), y);
  22. }
  23. if (typeof y === 'boolean') {
  24. return AbstractEqualityComparison(x, ToNumber(y));
  25. }
  26. if ((typeof x === 'string' || typeof x === 'number' || typeof x === 'symbol') && isObject(y)) {
  27. return AbstractEqualityComparison(x, ToPrimitive(y));
  28. }
  29. if (isObject(x) && (typeof y === 'string' || typeof y === 'number' || typeof y === 'symbol')) {
  30. return AbstractEqualityComparison(ToPrimitive(x), y);
  31. }
  32. return false;
  33. };