From bf3aa97c3614f032983afe0740813021e70a06dd Mon Sep 17 00:00:00 2001 From: Michael Ficarra Date: Sun, 4 Sep 2011 19:34:19 -0400 Subject: [PATCH] reverting some changes to isEqual that were a little too aggressive --- test/objects.js | 4 ++-- underscore.js | 17 ++++++++++------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/test/objects.js b/test/objects.js index 4234f0fad..bb0f98553 100644 --- a/test/objects.js +++ b/test/objects.js @@ -72,8 +72,8 @@ $(document).ready(function() { var moe = {name : 'moe', lucky : [13, 27, 34]}; var clone = {name : 'moe', lucky : [13, 27, 34]}; - var isEqualObj = {isEqual: function (o) { return o.isEqual == this.isEqual; }, unique: {}}; - var isEqualObjClone = {isEqual: isEqualObj.isEqual, unique: {}}; + var isEqualObj = {isEqual: function (o) { return o.isEqual == this.isEqual; }, unique: {}}; + var isEqualObjClone = {isEqual: isEqualObj.isEqual, unique: {}}; ok(moe != clone, 'basic equality between objects is false'); ok(_.isEqual(moe, clone), 'deep equality is true'); ok(_(moe).isEqual(clone), 'OO-style deep equality works'); diff --git a/underscore.js b/underscore.js index 3ad38311b..7615b5d5e 100644 --- a/underscore.js +++ b/underscore.js @@ -610,14 +610,16 @@ // `NaN` values are equal. if (_.isNaN(a)) return _.isNaN(b); // Compare dates by their millisecond values. - if (_.isDate(a)) return _.isDate(b) && a.getTime() == b.getTime(); + var isDateA = _.isDate(a), isDateB = _.isDate(b); + if (isDateA || isDateB) return isDateA && isDateB && a.getTime() == b.getTime(); // Compare RegExps by their source patterns and flags. - if (_.isRegExp(a)) - return _.isRegExp(b) && - a.source == b.source && - a.global == b.global && - a.multiline == b.multiline && - a.ignoreCase == b.ignoreCase; + var isRegExpA = _.isRegExp(a), isRegExpB = _.isRegExp(b); + if (isRegExpA || isRegExpB) + return isRegExpA && isRegExpB && + a.source == b.source && + a.global == b.global && + a.multiline == b.multiline && + a.ignoreCase == b.ignoreCase; // Ensure that both values are objects. if (typeA != 'object') return false; // Unwrap any wrapped objects. @@ -625,6 +627,7 @@ if (b._chain) b = b._wrapped; // Invoke a custom `isEqual` method if one is provided. if (typeof a.isEqual == 'function') return a.isEqual(b); + if (typeof b.isEqual == 'function') return b.isEqual(a); // Compare array lengths to determine if a deep comparison is necessary. if ('length' in a && (a.length !== b.length)) return false; // Assume equality for cyclic structures.