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