diff --git a/index.js b/index.js index 642cbc7..8e5e333 100644 --- a/index.js +++ b/index.js @@ -289,13 +289,18 @@ function regexpEqual(leftHandOperand, rightHandOperand) { */ function entriesEqual(leftHandOperand, rightHandOperand, options) { - // IE11 doesn't support Set#entries or Set#@@iterator, so we need manually populate using Set#forEach - if (leftHandOperand.size !== rightHandOperand.size) { + try { + // IE11 doesn't support Set#entries or Set#@@iterator, so we need manually populate using Set#forEach + if (leftHandOperand.size !== rightHandOperand.size) { + return false; + } + if (leftHandOperand.size === 0) { + return true; + } + } catch (sizeError) { + // things that aren't actual Maps or Sets will throw here return false; } - if (leftHandOperand.size === 0) { - return true; - } var leftHandItems = []; var rightHandItems = []; leftHandOperand.forEach(function gatherEntries(key, value) { diff --git a/test/new-ecmascript-types.js b/test/new-ecmascript-types.js index 190a686..ee6f09b 100644 --- a/test/new-ecmascript-types.js +++ b/test/new-ecmascript-types.js @@ -95,6 +95,13 @@ describe('ES2015 Specific', function () { assert(eql(mapA, mapB), 'eql(Map { a => 1, b => 2, c => 3 }, Map { a => 1, b => 2, c => 3 })'); }); + (setExists ? it : it.skip)('returns false for fake Maps', function () { + var maplikeSet = new Set(); + Object.defineProperty(maplikeSet, 'constructor', { enumerable: false, value: Map }); + + assert(eql(maplikeSet, new Map()) === false, 'eql(Set pretending to be a Map, Map { })'); + }); + }); describeIf(symbolAndMapExist && typeof Map.prototype[Symbol.iterator] === 'function')('map iterator', function () { @@ -238,6 +245,13 @@ describe('ES2015 Specific', function () { assert(eql(setA, setB) === true, 'eql(Set { -> }, Set { <- }) === true'); }); + (mapExists ? it : it.skip)('returns false for fake Sets', function () { + var setlikeMap = new Map(); + Object.defineProperty(setlikeMap, 'constructor', { enumerable: false, value: Set }); + + assert(eql(setlikeMap, new Set()) === false, 'eql(Map pretending to be a Set, Set { })'); + }); + }); describeIf(symbolAndSetExist && typeof Set.prototype[Symbol.iterator] === 'function')('set iterator', function () {