@@ -825,24 +825,31 @@ function shallowCopy(src, dst) {
825
825
* @param {* } o2 Object or value to compare.
826
826
* @returns {boolean } True if arguments are equal.
827
827
*/
828
- function equals ( o1 , o2 , visitedObjArr ) {
828
+ function equals ( o1 , o2 , comparisons ) {
829
829
if ( o1 === o2 ) return true ;
830
830
if ( o1 === null || o2 === null ) return false ;
831
831
if ( o1 !== o1 && o2 !== o2 ) return true ; // NaN === NaN
832
832
var t1 = typeof o1 , t2 = typeof o2 , length , key , keySet ;
833
833
if ( t1 == t2 ) {
834
834
if ( t1 == 'object' ) {
835
- if ( typeof visitedObjArr == 'undefined' ) {
836
- visitedObjArr = { } ;
835
+ comparisons || ( comparisons = new WeakMap ( ) ) ;
836
+ if ( comparisons . has ( o1 ) && comparisons . get ( o1 ) . has ( o2 ) ) {
837
+ return true ;
837
838
} else {
838
- if ( o1 in visitedObjArr ) return true ;
839
+ if ( ! comparisons . has ( o1 ) ) {
840
+ comparisons . set ( o1 , new WeakMap ( ) ) ;
841
+ }
842
+ comparisons . get ( o1 ) . set ( o2 , true ) ;
843
+ if ( ! comparisons . has ( o2 ) ) {
844
+ comparisons . set ( o2 , new WeakMap ( ) ) ;
845
+ }
846
+ comparisons . get ( o2 ) . set ( o1 , true ) ;
839
847
}
840
- visitedObjArr [ o1 ] = true ;
841
848
if ( isArray ( o1 ) ) {
842
849
if ( ! isArray ( o2 ) ) return false ;
843
850
if ( ( length = o1 . length ) == o2 . length ) {
844
851
for ( key = 0 ; key < length ; key ++ ) {
845
- if ( ! equals ( o1 [ key ] , o2 [ key ] , visitedObjArr ) ) return false ;
852
+ if ( ! equals ( o1 [ key ] , o2 [ key ] , comparisons ) ) return false ;
846
853
}
847
854
return true ;
848
855
}
@@ -856,7 +863,7 @@ function equals(o1, o2, visitedObjArr) {
856
863
keySet = { } ;
857
864
for ( key in o1 ) {
858
865
if ( key . charAt ( 0 ) === '$' || isFunction ( o1 [ key ] ) ) continue ;
859
- if ( ! equals ( o1 [ key ] , o2 [ key ] , visitedObjArr ) ) return false ;
866
+ if ( ! equals ( o1 [ key ] , o2 [ key ] , comparisons ) ) return false ;
860
867
keySet [ key ] = true ;
861
868
}
862
869
for ( key in o2 ) {
0 commit comments