Skip to content

Instantly share code, notes, and snippets.

@phlego
Last active August 7, 2020 12:53
Show Gist options
  • Save phlego/0a36efbd1475c5681879eb1b8b05edf9 to your computer and use it in GitHub Desktop.
Save phlego/0a36efbd1475c5681879eb1b8b05edf9 to your computer and use it in GitHub Desktop.
Reinvent ===
/**
* Reinvent ===
* @ref [Equality comparisons and sameness](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness)
* @ref [JavaScript Equality Table](https://dorey.github.io/JavaScript-Equality-Table/)
*/
export const strictEquals = (a, b) => {
if (typeof a == 'number' && typeof b == 'number') {
if (isNaN(a) && isNaN(b)) {
return false;
} else if ((Object.is(a, 0) && Object.is(b, -0)) || (Object.is(a, -0) && Object.is(b, 0))) {
return true;
}
}
return Object.is(a, b);
};
import { strictEquals } from './strictEquals';
const testCases = [
{ values: [undefined, undefined] },
{ values: [null, null] },
{ values: [true] },
{ values: [false] },
{ values: ['foo', 'foo'], keys: ["'foo'", "'foo'"] },
{ values: [0, 0] },
{ values: [+0, -0], keys: ['+0', '-0'] },
{ values: [+0, 0], keys: ['+0'] },
{ values: [-0, 0], keys: ['-0'] },
{ values: [1, 1] },
{ values: [0, 0] },
{ values: [-1, -1] },
{ values: [1, 0] },
{ values: [-1, 0] },
{ values: [-1, 1] },
{ values: [Infinity, Infinity] },
{ values: [-Infinity, -Infinity] },
{ values: [Infinity, -Infinity] },
{ values: [0, false] },
{ values: ['', false], keys: ["''"] },
{ values: ['', 0], keys: ["''"] },
{ values: ['0', 0], keys: ["'0'"] },
{ values: ['17', 17], keys: ["'17'"] },
{ values: [[1, 2], '1,2'], keys: ['[1, 2]', "'1,2'"] },
// eslint-disable-next-line no-new-wrappers
{ values: [new String('foo'), 'foo'], keys: ["new String('foo')", "'foo'"] },
{ values: [null, undefined] },
{ values: [null, false] },
{ values: [undefined, false] },
{ values: [{ foo: 'bar' }, { foo: 'bar' }], keys: ["{ foo: 'bar' }", "{ foo: 'bar' }"] },
// eslint-disable-next-line no-new-wrappers
{ values: [new String('foo'), new String('foo')], keys: ["new String('foo')", "new String('foo')"] },
{ values: [0, null] },
{ values: [0, NaN] },
{ values: ["'foo'", NaN] },
{ values: [NaN, NaN] },
{ values: [[], []], keys: ['[]', '[]'] },
{ values: [{}, {}], keys: ['{}', '{}'] },
{ values: [[[]], [[]]], keys: ['[[]]', '[[]]'] },
{ values: [[0], [0]], keys: ['[0]', '[0]'] },
{ values: [[1], [1]], keys: ['[1]', '[1]'] },
];
testCases.forEach(({ values, keys }) => {
const [ka, kb] = keys && keys.length ? keys : values;
const [va, vb] = values;
const isStrictEqual = va === vb;
test(`${ka || va} === ${kb || vb} -> ${isStrictEqual}`, () => {
expect(strictEquals(va, vb)).toBe(isStrictEqual);
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment