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

Commit e8c54bb

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

File tree

1 file changed

+111
-32
lines changed

1 file changed

+111
-32
lines changed

src/Angular.js

+111-32
Original file line numberDiff line numberDiff line change
@@ -977,46 +977,125 @@ 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)) {
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);
9921020
}
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);
10071029
}
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;
10131067
}
1014-
return true;
10151068
}
1069+
return true;
10161070
}
1071+
10171072
return false;
10181073
}
10191074

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+
10201099
var csp = function() {
10211100
if (!isDefined(csp.rules)) {
10221101

0 commit comments

Comments
 (0)