fix(angular.equals): consistently compare undefined object props

previously:

a = {};
b = {x:undefined};
angular.equals(a, b) == angular.equals(b, a) // returns false.

both should return false because these objects are not equal.

unlike in implemented in #1695 the comparison should be stricter
and return false not true. if we need to relax this in the future
we can always do so.

Closes #1648
This commit is contained in:
Igor Minar 2013-01-17 16:53:30 -08:00
parent 8b44324814
commit 5ae63fd385
2 changed files with 20 additions and 5 deletions

View file

@ -620,16 +620,23 @@ function equals(o1, o2) {
} else { } else {
if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2)) return false; if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2)) return false;
keySet = {}; keySet = {};
length = 0;
for(key in o1) { for(key in o1) {
if (key.charAt(0) !== '$' && !isFunction(o1[key]) && !equals(o1[key], o2[key])) { if (key.charAt(0) === '$') continue;
return false;
} if (!isFunction(o1[key]) && !equals(o1[key], o2[key])) return false;
length++;
keySet[key] = true; keySet[key] = true;
} }
for(key in o2) { for(key in o2) {
if (!keySet[key] && key.charAt(0) !== '$' && !isFunction(o2[key])) return false; if (key.charAt(0) === '$') {
continue;
}
if (!keySet[key] && !isFunction(o2[key])) return false;
length--;
} }
return true; return length === 0;
} }
} }
} }

View file

@ -126,6 +126,14 @@ describe('angular', function() {
expect(equals(['misko'], ['misko', 'adam'])).toEqual(false); expect(equals(['misko'], ['misko', 'adam'])).toEqual(false);
}); });
it('should ignore undefined member variables', function() {
var obj1 = {name: 'misko'},
obj2 = {name: 'misko', undefinedvar: undefined};
expect(equals(obj1, obj2)).toBe(false);
expect(equals(obj2, obj1)).toBe(false);
});
it('should ignore $ member variables', function() { it('should ignore $ member variables', function() {
expect(equals({name:'misko', $id:1}, {name:'misko', $id:2})).toEqual(true); expect(equals({name:'misko', $id:1}, {name:'misko', $id:2})).toEqual(true);
expect(equals({name:'misko'}, {name:'misko', $id:2})).toEqual(true); expect(equals({name:'misko'}, {name:'misko', $id:2})).toEqual(true);