diff --git a/index.js b/index.js index 5eee1ac..8b65f8f 100644 --- a/index.js +++ b/index.js @@ -379,6 +379,11 @@ function getEnumerableKeys(target) { return keys; } +function getNonEnumerableSymbols(target) { + var keys = Object.getOwnPropertySymbols(target); + return keys; +} + /*! * Determines if two objects have matching values, given a set of keys. Defers to deepEqual for the equality check of * 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) { function objectEqual(leftHandOperand, rightHandOperand, options) { var leftHandKeys = getEnumerableKeys(leftHandOperand); var rightHandKeys = getEnumerableKeys(rightHandOperand); + var leftHandSymbols = getNonEnumerableSymbols(leftHandOperand); + var rightHandSymbols = getNonEnumerableSymbols(rightHandOperand); + if (leftHandSymbols) { + leftHandKeys = leftHandKeys.concat(leftHandSymbols); + } + if (rightHandSymbols) { + rightHandKeys = rightHandKeys.concat(rightHandSymbols); + } if (leftHandKeys.length && leftHandKeys.length === rightHandKeys.length) { leftHandKeys.sort(); rightHandKeys.sort(); diff --git a/test/index.js b/test/index.js index 28f95b6..64909e8 100644 --- a/test/index.js +++ b/test/index.js @@ -377,6 +377,48 @@ describe('Generic', function () { }); + describe('Symbols', function () { + + it('returns true for same symbols', function () { + var symb = Symbol('a'); + var objectA = { [symb]: 'a' }; + var objectB = { [symb]: 'a' }; + assert(eql(objectA, objectB) === true, 'eql(obj, obj)'); + }); + + it('returns false for different values', function () { + var symb = Symbol('a'); + var objectA = { [symb]: 'a' }; + var objectB = { [symb]: 'b' }; + assert(eql(objectA, objectB) === false, 'eql(obj, obj) === false'); + }); + + it('returns false for different symbols', function () { + var symb = Symbol('a'); + var symb2 = Symbol('b'); + var objectA = { [symb]: 'a' }; + var objectB = { [symb2]: 'a' }; + assert(eql(objectA, objectB) === false, 'eql(obj, obj) === false'); + }); + + it('returns true for same nested symbols', function () { + var symb = Symbol('a'); + var symb2 = Symbol('b'); + var objectA = { [symb]: { [symb2]: 'a' } }; + var objectB = { [symb]: { [symb2]: 'a' } }; + assert(eql(objectA, objectB) === true, 'eql(obj, obj)'); + }); + + it('returns false for different nested symbols', function () { + var symb = Symbol('a'); + var symb2 = Symbol('b'); + var objectA = { [symb]: { [symb2]: 'a' } }; + var objectB = { [symb]: { [symb]: 'a' } }; + assert(eql(objectA, objectB) === false, 'eql(obj, obj) === false'); + }); + }); + + describe('errors', function () { it('returns true for same errors', function () {