@@ -977,46 +977,125 @@ function shallowCopy(src, dst) {
977
977
* @returns {boolean } True if arguments are equal.
978
978
*/
979
979
function equals ( o1 , o2 ) {
980
- if ( o1 === o2 ) return true ;
981
- if ( o1 === null || o2 === null ) return false ;
982
- if ( o1 !== o1 && o2 !== o2 ) return true ; // NaN === NaN
983
- var t1 = typeof o1 , t2 = typeof o2 , length , key , keySet ;
984
- if ( t1 == t2 && t1 == 'object' ) {
985
- if ( isArray ( o1 ) ) {
986
- if ( ! isArray ( o2 ) ) return false ;
987
- if ( ( length = o1 . length ) == o2 . length ) {
988
- for ( key = 0 ; key < length ; key ++ ) {
989
- if ( ! equals ( o1 [ key ] , o2 [ key ] ) ) return false ;
990
- }
991
- return true ;
980
+
981
+ if ( areBothEqualValues ( o1 , o2 ) ) {
982
+ return true ;
983
+ }
984
+
985
+ if ( isAnyOneHasValueEqualNull ( o1 , o2 ) ) {
986
+ return false ;
987
+ }
988
+
989
+ if ( areBothValuesEqualNaN ( o1 , o2 ) ) {
990
+ return true ;
991
+ }
992
+
993
+ if ( areBothObjectsEqual ( o1 , o2 ) ) {
994
+ return true ;
995
+ }
996
+
997
+ return false ;
998
+ }
999
+
1000
+ function areBothEqualValues ( o1 , o2 ) {
1001
+ return ( o1 === o2 ) ;
1002
+ }
1003
+
1004
+ function isAnyOneHasValueEqualNull ( o1 , o2 ) {
1005
+ return ( o1 === null || o2 === null ) ;
1006
+ }
1007
+
1008
+ function areBothValuesEqualNaN ( o1 , o2 ) {
1009
+ return ( o1 !== o1 && o2 !== o2 ) ;
1010
+ }
1011
+
1012
+ function areBothObjectsEqual ( o1 , o2 ) {
1013
+
1014
+ if ( areBothObjectsEqualType ( o1 , o2 ) ) {
1015
+ var isO1ArrayType = isArray ( o1 ) ;
1016
+ var isO2ArrayType = isArray ( o2 ) ;
1017
+ if ( isO1ArrayType || isO2ArrayType ) {
1018
+ if ( isO2ArrayType && isO2ArrayType ) {
1019
+ return areBothArraysEqual ( o1 , o2 ) ;
992
1020
}
993
- } else if ( isDate ( o1 ) ) {
994
- if ( ! isDate ( o2 ) ) return false ;
995
- return equals ( o1 . getTime ( ) , o2 . getTime ( ) ) ;
996
- } else if ( isRegExp ( o1 ) ) {
997
- if ( ! isRegExp ( o2 ) ) return false ;
998
- return o1 . toString ( ) == o2 . toString ( ) ;
999
- } else {
1000
- if ( isScope ( o1 ) || isScope ( o2 ) || isWindow ( o1 ) || isWindow ( o2 ) ||
1001
- isArray ( o2 ) || isDate ( o2 ) || isRegExp ( o2 ) ) return false ;
1002
- keySet = createMap ( ) ;
1003
- for ( key in o1 ) {
1004
- if ( key . charAt ( 0 ) === '$' || isFunction ( o1 [ key ] ) ) continue ;
1005
- if ( ! equals ( o1 [ key ] , o2 [ key ] ) ) return false ;
1006
- keySet [ key ] = true ;
1021
+ return false ;
1022
+ }
1023
+
1024
+ var isO1DateType = isDate ( o1 ) ;
1025
+ var isO2DateType = isDate ( o2 ) ;
1026
+ if ( isO1DateType || isO2DateType ) {
1027
+ if ( isO1DateType && isO2DateType ) {
1028
+ return areBothDatesEqual ( o1 , o2 ) ;
1007
1029
}
1008
- for ( key in o2 ) {
1009
- if ( ! ( key in keySet ) &&
1010
- key . charAt ( 0 ) !== '$' &&
1011
- isDefined ( o2 [ key ] ) &&
1012
- ! isFunction ( o2 [ key ] ) ) return false ;
1030
+ return false ;
1031
+ }
1032
+
1033
+ var isO1RegExpType = isRegExp ( o1 ) ;
1034
+ var isO2RegExpType = isRegExp ( o2 ) ;
1035
+
1036
+ if ( isO1RegExpType || isO2RegExpType ) {
1037
+ if ( isO1RegExpType && isO2RegExpType ) {
1038
+ return areBothRegExpEqual ( o1 , o2 ) ;
1039
+ }
1040
+ return false ;
1041
+
1042
+ }
1043
+
1044
+ if ( isScope ( o1 ) || isScope ( o2 ) || isWindow ( o1 ) || isWindow ( o2 ) ) return false ;
1045
+
1046
+ return areBothMapsEqual ( o1 , o2 ) ;
1047
+
1048
+ }
1049
+
1050
+ return false ;
1051
+ }
1052
+
1053
+ function areBothObjectsEqualType ( o1 , o2 ) {
1054
+ var t1 = typeof o1 ;
1055
+ var t2 = typeof o2 ;
1056
+
1057
+ return ( t1 == t2 && t1 == 'object' ) ;
1058
+ }
1059
+
1060
+ function areBothArraysEqual ( o1 , o2 ) {
1061
+ var length , key ;
1062
+
1063
+ if ( ( length = o1 . length ) == o2 . length ) {
1064
+ for ( key = 0 ; key < length ; key ++ ) {
1065
+ if ( ! equals ( o1 [ key ] , o2 [ key ] ) ) {
1066
+ return false ;
1013
1067
}
1014
- return true ;
1015
1068
}
1069
+ return true ;
1016
1070
}
1071
+
1017
1072
return false ;
1018
1073
}
1019
1074
1075
+ function areBothDatesEqual ( o1 , o2 ) {
1076
+ return equals ( o1 . getTime ( ) , o2 . getTime ( ) ) ;
1077
+ }
1078
+
1079
+ function areBothRegExpEqual ( o1 , o2 ) {
1080
+ return ( o1 . toString ( ) == o2 . toString ( ) ) ;
1081
+ }
1082
+
1083
+ function areBothMapsEqual ( o1 , o2 ) {
1084
+ var keySet , key ;
1085
+ keySet = createMap ( ) ;
1086
+ for ( key in o1 ) {
1087
+ if ( key . charAt ( 0 ) === '$' || isFunction ( o1 [ key ] ) ) continue ;
1088
+ if ( ! equals ( o1 [ key ] , o2 [ key ] ) ) return false ;
1089
+ keySet [ key ] = true ;
1090
+ }
1091
+ for ( key in o2 ) {
1092
+ if ( ! ( key in keySet ) &&
1093
+ key . charAt ( 0 ) !== '$' &&
1094
+ isDefined ( o2 [ key ] ) && ! isFunction ( o2 [ key ] ) ) return false ;
1095
+ }
1096
+ return true ;
1097
+ }
1098
+
1020
1099
var csp = function ( ) {
1021
1100
if ( ! isDefined ( csp . rules ) ) {
1022
1101
0 commit comments