mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-05-02 20:24:45 +00:00
fix(angular.equals): do not match keys defined in the prototype chain
Merely testing for object[key] will give incorrect results on keys defined in Object.prototype. Note: IE8 is generally broken in this regard since `for...in` never returns certain property keys even if they are defined directly on the object. See #2141 - partially merges this PR
This commit is contained in:
parent
d88dc4a64f
commit
7829c50f9e
2 changed files with 19 additions and 1 deletions
|
|
@ -2,6 +2,16 @@
|
||||||
|
|
||||||
////////////////////////////////////
|
////////////////////////////////////
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hasOwnProperty may be overriden by a property of the same name, or entirely
|
||||||
|
* absent from an object that does not inherit Object.prototype; this copy is
|
||||||
|
* used instead
|
||||||
|
*/
|
||||||
|
var hasOwnPropertyFn = Object.prototype.hasOwnProperty;
|
||||||
|
var hasOwnPropertyLocal = function(obj, key) {
|
||||||
|
return hasOwnPropertyFn.call(obj, key);
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ngdoc function
|
* @ngdoc function
|
||||||
* @name angular.lowercase
|
* @name angular.lowercase
|
||||||
|
|
@ -685,7 +695,7 @@ function equals(o1, o2) {
|
||||||
keySet[key] = true;
|
keySet[key] = true;
|
||||||
}
|
}
|
||||||
for(key in o2) {
|
for(key in o2) {
|
||||||
if (!keySet[key] &&
|
if (!keySet.hasOwnProperty(key) &&
|
||||||
key.charAt(0) !== '$' &&
|
key.charAt(0) !== '$' &&
|
||||||
o2[key] !== undefined &&
|
o2[key] !== undefined &&
|
||||||
!isFunction(o2[key])) return false;
|
!isFunction(o2[key])) return false;
|
||||||
|
|
|
||||||
|
|
@ -270,6 +270,14 @@ describe('angular', function() {
|
||||||
expect(equals(new Date(0), 0)).toBe(false);
|
expect(equals(new Date(0), 0)).toBe(false);
|
||||||
expect(equals(0, new Date(0))).toBe(false);
|
expect(equals(0, new Date(0))).toBe(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should correctly test for keys that are present on Object.prototype', function() {
|
||||||
|
// MS IE8 just doesn't work for this kind of thing, since "for ... in" doesn't return
|
||||||
|
// things like hasOwnProperty even if it is explicitly defined on the actual object!
|
||||||
|
if (msie<=8) return;
|
||||||
|
expect(equals({}, {hasOwnProperty: 1})).toBe(false);
|
||||||
|
expect(equals({}, {toString: null})).toBe(false);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('size', function() {
|
describe('size', function() {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue