diff --git a/lodash.src.js b/lodash.src.js index baa31e9b0..77bbee232 100644 --- a/lodash.src.js +++ b/lodash.src.js @@ -9715,13 +9715,18 @@ return false; } var result = hasOwnProperty.call(object, path); - if (!result && !isKey(path)) { - path = toPath(path); - object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); - path = last(path); - result = object != null && hasOwnProperty.call(object, path); + if (result) { + return result; } - return result || (lodash.support.nonEnumStrings && isString(object) && isIndex(path, object.length)); + if (isKey(path)) { + var length = object.length; + return isLength(length) && + (isArray(object) || (support.nonEnumStrings && isString(object)) || + (support.nonEnumArgs && isArguments(object))) && isIndex(path, length); + } + path = toPath(path); + object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); + return object != null && hasOwnProperty.call(object, last(path)); } /** diff --git a/test/test.js b/test/test.js index 1f1581901..cc388a58c 100644 --- a/test/test.js +++ b/test/test.js @@ -6248,6 +6248,8 @@ QUnit.module('lodash.has'); (function() { + var args = arguments; + test('should check for own properties', 2, function() { var object = { 'a': 1 }; @@ -6311,6 +6313,14 @@ }); }); + test('should treat sparse arrays as dense', 1, function() { + strictEqual(_.has(Array(1), 0), true); + }); + + test('should work with `arguments` objects', 1, function() { + strictEqual(_.has(args, 1), true); + }); + test('should check for a key over a path', 2, function() { var object = { 'a.b.c': 3, 'a': { 'b': { 'c': 4 } } }; @@ -6352,7 +6362,7 @@ strictEqual(_.has(object, path), false); }); }); - }()); + }(1, 2, 3)); /*--------------------------------------------------------------------------*/