Skip to content

Commit

Permalink
[Refactor] add isSameType helper, and use it
Browse files Browse the repository at this point in the history
  • Loading branch information
ljharb committed Jan 14, 2025
1 parent 4c637a8 commit 8ffad76
Show file tree
Hide file tree
Showing 15 changed files with 90 additions and 26 deletions.
4 changes: 2 additions & 2 deletions 2015/AbstractEqualityComparison.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

var isSameType = require('../helpers/isSameType');
var isObject = require('../helpers/isObject');

// https://262.ecma-international.org/6.0/#sec-abstract-equality-comparison

module.exports = function AbstractEqualityComparison(x, y) {
if (Type(x) === Type(y)) {
if (isSameType(x, y)) {
return x === y; // ES6+ specified this shortcut anyways.
}
if (x == null && y == null) {
Expand Down
4 changes: 2 additions & 2 deletions 2016/AbstractEqualityComparison.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions 2017/AbstractEqualityComparison.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions 2018/AbstractEqualityComparison.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions 2019/AbstractEqualityComparison.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions 2020/AbstractEqualityComparison.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ var StrictEqualityComparison = require('./StrictEqualityComparison');
var StringToBigInt = require('./StringToBigInt');
var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

var isNaN = require('math-intrinsics/isNaN');
var isSameType = require('../helpers/isSameType');
var isObject = require('../helpers/isObject');

// https://262.ecma-international.org/11.0/#sec-abstract-equality-comparison

module.exports = function AbstractEqualityComparison(x, y) {
if (Type(x) === Type(y)) {
if (isSameType(x, y)) {
return StrictEqualityComparison(x, y);
}
if (x == null && y == null) {
Expand Down
5 changes: 3 additions & 2 deletions 2020/AbstractRelationalComparison.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,12 @@ var IsStringPrefix = require('./IsStringPrefix');
var StringToBigInt = require('./StringToBigInt');
var ToNumeric = require('./ToNumeric');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

var BigIntLessThan = require('./BigInt/lessThan');
var NumberLessThan = require('./Number/lessThan');

var isSameType = require('../helpers/isSameType');

// https://262.ecma-international.org/11.0/#sec-abstract-relational-comparison

// eslint-disable-next-line max-statements, max-lines-per-function
Expand Down Expand Up @@ -61,7 +62,7 @@ module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {

nx = ToNumeric(px);
ny = ToNumeric(py);
if (Type(nx) === Type(ny)) {
if (isSameType(nx, ny)) {
return typeof nx === 'number' ? NumberLessThan(nx, ny) : BigIntLessThan(nx, ny);
}

Expand Down
4 changes: 2 additions & 2 deletions 2021/AbstractEqualityComparison.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions 2021/AbstractRelationalComparison.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions 2022/IsLooselyEqual.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@ var IsStrictlyEqual = require('./IsStrictlyEqual');
var StringToBigInt = require('./StringToBigInt');
var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

var isSameType = require('../helpers/isSameType');
var isObject = require('../helpers/isObject');

// https://262.ecma-international.org/13.0/#sec-islooselyequal

module.exports = function IsLooselyEqual(x, y) {
if (Type(x) === Type(y)) {
if (isSameType(x, y)) {
return IsStrictlyEqual(x, y);
}
if (x == null && y == null) {
Expand Down
4 changes: 2 additions & 2 deletions 2023/IsLooselyEqual.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions 2024/IsLooselyEqual.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions 5/AbstractEqualityComparison.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

var isSameType = require('../helpers/isSameType');
var isObject = require('../helpers/isObject');

// https://262.ecma-international.org/5.1/#sec-11.9.3

module.exports = function AbstractEqualityComparison(x, y) {
if (Type(x) === Type(y)) {
if (isSameType(x, y)) {
return x === y; // ES6+ specified this shortcut anyways.
}
if (x == null && y == null) {
Expand Down
16 changes: 16 additions & 0 deletions helpers/isSameType.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
'use strict';

module.exports = function isSameType(x, y) {
if (x === y) {
return true;
}

if (typeof x === typeof y) {
if (typeof x !== 'object' || typeof y !== 'object') {
return true;
}
return !!x === !!y;
}

return false;
};
46 changes: 46 additions & 0 deletions test/helpers/isSameType.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
'use strict';

var test = require('tape');
var forEach = require('for-each');
var inspect = require('object-inspect');

var isSameType = require('../../helpers/isSameType');

test('isSameType', function (t) {
forEach([
undefined,
null,
false,
true,
42,
NaN,
0,
-1,
Infinity,
-Infinity,
'',
'abc'
], function (v) {
t.ok(isSameType(v, v), inspect(v) + ' is the same type as itself');
});

forEach([
[42, NaN],
['', 'abc']
], function (pair) {
t.ok(isSameType(pair[0], pair[1]), inspect(pair[0]) + ' is the same type as ' + inspect(pair[1]));
t.ok(isSameType(pair[1], pair[0]), inspect(pair[1]) + ' is the same type as ' + inspect(pair[0]));
});

forEach([
[null, undefined],
[1, '1'],
[1, Object(1)],
[null, {}]
], function (pair) {
t.notOk(isSameType(pair[0], pair[1]), inspect(pair[0]) + ' is not the same type as ' + inspect(pair[1]));
t.notOk(isSameType(pair[1], pair[0]), inspect(pair[1]) + ' is not the same type as ' + inspect(pair[0]));
});

t.end();
});

0 comments on commit 8ffad76

Please sign in to comment.