diff --git a/lodash.js b/lodash.js index 09874e95b..379737923 100644 --- a/lodash.js +++ b/lodash.js @@ -7786,7 +7786,7 @@ // property containing a primitive value if (propsLength == 1 && value === value && !isObject(value)) { return function(object) { - if (!hasOwnProperty.call(object, key)) { + if (!(object && hasOwnProperty.call(object, key))) { return false; } // treat `-0` vs. `+0` as not equal @@ -7795,9 +7795,11 @@ }; } return function(object) { - var length = propsLength, - result = true; - + var length = propsLength; + if (length && !object) { + return false; + } + var result = true; while (length--) { var key = props[length]; if (!(result = hasOwnProperty.call(object, key) && diff --git a/test/test.js b/test/test.js index d8c41951d..d973a01b8 100644 --- a/test/test.js +++ b/test/test.js @@ -5808,13 +5808,47 @@ strictEqual(matches.length, 1); strictEqual(matches(object), true); - matches = _.matches({ 'b': 1 }); + matches = _.matches({ 'b': 1 }); strictEqual(matches(object), false); }); test('should return `true` when comparing an empty `source`', 1, function() { - var matches = _.matches({}); - strictEqual(matches(object), true); + var expected = _.map(empties, _.constant(true)); + + var actual = _.map(empties, function(value) { + var matches = _.matches(value); + return matches(object) === true; + }); + + deepEqual(actual, expected); + }); + + test('should not error error for falsey `object` values', 1, function() { + var expected = _.map(falsey, _.constant(true)), + matches = _.matches({ 'a': 1 }); + + var actual = _.map(falsey, function(value, index) { + try { + var result = index ? matches(value) : matches(); + return result === false; + } catch(e) { } + }); + + deepEqual(actual, expected); + }); + + test('should return `true` when comparing an empty `source` to a falsey `object`', 1, function() { + var expected = _.map(falsey, _.constant(true)), + matches = _.matches({}); + + var actual = _.map(falsey, function(value, index) { + try { + var result = index ? matches(value) : matches(); + return result === true; + } catch(e) { } + }); + + deepEqual(actual, expected); }); }()); @@ -6943,7 +6977,7 @@ strictEqual(property.length, 1); strictEqual(property(object), 1); - property = _.property('b'); + property = _.property('b'); strictEqual(property(object), 2); });