Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 7f8c3a2

Browse files
committed
refactor(equalsFunction): divide internal implemenation
extract complex logic to named methods fixes #13957
1 parent c4e47e4 commit 7f8c3a2

File tree

1 file changed

+100
-32
lines changed

1 file changed

+100
-32
lines changed

src/Angular.js

+100-32
Original file line numberDiff line numberDiff line change
@@ -977,46 +977,114 @@ function shallowCopy(src, dst) {
977977
* @returns {boolean} True if arguments are equal.
978978
*/
979979
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)) 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 areBothEqualValues(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);
9921009
}
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);
10071018
}
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);
10131028
}
1014-
return true;
1029+
return false;
1030+
10151031
}
1032+
1033+
if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2)) return false;
1034+
1035+
return areBothMapsEqual(o1, o2);
1036+
10161037
}
1038+
10171039
return false;
10181040
}
10191041

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+
10201088
var csp = function() {
10211089
if (!isDefined(csp.rules)) {
10221090

0 commit comments

Comments
 (0)