Skip to content

Commit 67d704c

Browse files
authored
fix: deep symbol comparison (#81)
1 parent 3b39bf3 commit 67d704c

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

index.js

+13
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,11 @@ function getEnumerableKeys(target) {
379379
return keys;
380380
}
381381

382+
function getNonEnumerableSymbols(target) {
383+
var keys = Object.getOwnPropertySymbols(target);
384+
return keys;
385+
}
386+
382387
/*!
383388
* Determines if two objects have matching values, given a set of keys. Defers to deepEqual for the equality check of
384389
* each key. If any value of the given key is not equal, the function will return false (early).
@@ -414,6 +419,14 @@ function keysEqual(leftHandOperand, rightHandOperand, keys, options) {
414419
function objectEqual(leftHandOperand, rightHandOperand, options) {
415420
var leftHandKeys = getEnumerableKeys(leftHandOperand);
416421
var rightHandKeys = getEnumerableKeys(rightHandOperand);
422+
var leftHandSymbols = getNonEnumerableSymbols(leftHandOperand);
423+
var rightHandSymbols = getNonEnumerableSymbols(rightHandOperand);
424+
if (leftHandSymbols) {
425+
leftHandKeys = leftHandKeys.concat(leftHandSymbols);
426+
}
427+
if (rightHandSymbols) {
428+
rightHandKeys = rightHandKeys.concat(rightHandSymbols);
429+
}
417430
if (leftHandKeys.length && leftHandKeys.length === rightHandKeys.length) {
418431
leftHandKeys.sort();
419432
rightHandKeys.sort();

test/index.js

+42
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,48 @@ describe('Generic', function () {
377377

378378
});
379379

380+
describe('Symbols', function () {
381+
382+
it('returns true for same symbols', function () {
383+
var symb = Symbol('a');
384+
var objectA = { [symb]: 'a' };
385+
var objectB = { [symb]: 'a' };
386+
assert(eql(objectA, objectB) === true, 'eql(obj, obj)');
387+
});
388+
389+
it('returns false for different values', function () {
390+
var symb = Symbol('a');
391+
var objectA = { [symb]: 'a' };
392+
var objectB = { [symb]: 'b' };
393+
assert(eql(objectA, objectB) === false, 'eql(obj, obj) === false');
394+
});
395+
396+
it('returns false for different symbols', function () {
397+
var symb = Symbol('a');
398+
var symb2 = Symbol('b');
399+
var objectA = { [symb]: 'a' };
400+
var objectB = { [symb2]: 'a' };
401+
assert(eql(objectA, objectB) === false, 'eql(obj, obj) === false');
402+
});
403+
404+
it('returns true for same nested symbols', function () {
405+
var symb = Symbol('a');
406+
var symb2 = Symbol('b');
407+
var objectA = { [symb]: { [symb2]: 'a' } };
408+
var objectB = { [symb]: { [symb2]: 'a' } };
409+
assert(eql(objectA, objectB) === true, 'eql(obj, obj)');
410+
});
411+
412+
it('returns false for different nested symbols', function () {
413+
var symb = Symbol('a');
414+
var symb2 = Symbol('b');
415+
var objectA = { [symb]: { [symb2]: 'a' } };
416+
var objectB = { [symb]: { [symb]: 'a' } };
417+
assert(eql(objectA, objectB) === false, 'eql(obj, obj) === false');
418+
});
419+
});
420+
421+
380422
describe('errors', function () {
381423

382424
it('returns true for same errors', function () {

0 commit comments

Comments
 (0)