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

Commit

Permalink
fix(angular.equals): relax the comparison for undefined properties
Browse files Browse the repository at this point in the history
in 5ae63fd the comparison was made consistent but strict, so that

angular.equals({}, {foo: undefined}) // always returns false

this turns out to cause issues for data that is being roundtripped via network
and serialized via JSON because JSON.stringify serializes {foo: undefined} as {}.

Since angular.equals() behaved like this before the 5ae63fd in 50% of the cases,
changing the behavior in this way should not introduce any significant issues.

Closes #1648
  • Loading branch information
IgorMinar committed Jan 22, 2013
1 parent cdf7781 commit 3c2e1c5
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 15 deletions.
19 changes: 7 additions & 12 deletions src/Angular.js
Original file line number Diff line number Diff line change
Expand Up @@ -620,23 +620,18 @@ function equals(o1, o2) {
} else {
if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2)) return false;
keySet = {};
length = 0;
for(key in o1) {
if (key.charAt(0) === '$') continue;

if (!isFunction(o1[key]) && !equals(o1[key], o2[key])) return false;

length++;
if (key.charAt(0) === '$' || isFunction(o1[key])) continue;
if (!equals(o1[key], o2[key])) return false;
keySet[key] = true;
}
for(key in o2) {
if (key.charAt(0) === '$') {
continue;
}
if (!keySet[key] && !isFunction(o2[key])) return false;
length--;
if (!keySet[key] &&
key.charAt(0) !== '$' &&
o2[key] !== undefined &&
!isFunction(o2[key])) return false;
}
return length === 0;
return true;
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions test/AngularSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -126,12 +126,12 @@ describe('angular', function() {
expect(equals(['misko'], ['misko', 'adam'])).toEqual(false);
});

it('should ignore undefined member variables', function() {
it('should ignore undefined member variables during comparison', function() {
var obj1 = {name: 'misko'},
obj2 = {name: 'misko', undefinedvar: undefined};

expect(equals(obj1, obj2)).toBe(false);
expect(equals(obj2, obj1)).toBe(false);
expect(equals(obj1, obj2)).toBe(true);
expect(equals(obj2, obj1)).toBe(true);
});

it('should ignore $ member variables', function() {
Expand Down

0 comments on commit 3c2e1c5

Please sign in to comment.