From 73f6fd49d015d92b6d0172f6e3173d37c6ba6e7e Mon Sep 17 00:00:00 2001 From: John-David Dalton Date: Mon, 16 Jun 2014 12:27:21 -0700 Subject: [PATCH] Align `_.keys` with ES6 and coerce primitives to objects. --- dist/lodash.js | 17 +++++++++-------- lodash.js | 13 +++++++------ test/test.js | 11 ++++++++--- test/underscore.html | 3 ++- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/dist/lodash.js b/dist/lodash.js index fb86bf6bb..b22b4304d 100644 --- a/dist/lodash.js +++ b/dist/lodash.js @@ -6799,14 +6799,16 @@ * // => ['x', 'y'] (property order is not guaranteed across environments) */ var keys = !nativeKeys ? shimKeys : function(object) { - var Ctor = object && object.constructor, - length = object ? object.length : 0; + object = Object(object); + + var Ctor = object.constructor, + length = object.length; if ((Ctor && object === Ctor.prototype) || (typeof length == 'number' && length > 0)) { return shimKeys(object); } - return isObject(object) ? nativeKeys(object) : []; + return nativeKeys(object); }; /** @@ -6830,9 +6832,8 @@ * // => ['x', 'y', 'z'] (property order is not guaranteed across environments) */ function keysIn(object) { - if (!isObject(object)) { - return []; - } + object = Object(object); + var length = object.length; length = (typeof length == 'number' && length > 0 && (isArray(object) || (support.nonEnumArgs && isArguments(object))) && length) >>> 0; @@ -8461,10 +8462,8 @@ lodash.map = map; lodash.mapValues = mapValues; lodash.matches = matches; - lodash.max = max; lodash.memoize = memoize; lodash.merge = merge; - lodash.min = min; lodash.mixin = mixin; lodash.negate = negate; lodash.omit = omit; @@ -8559,6 +8558,8 @@ lodash.isUndefined = isUndefined; lodash.kebabCase = kebabCase; lodash.lastIndexOf = lastIndexOf; + lodash.max = max; + lodash.min = min; lodash.noConflict = noConflict; lodash.noop = noop; lodash.now = now; diff --git a/lodash.js b/lodash.js index 2767a07a0..54690fce6 100644 --- a/lodash.js +++ b/lodash.js @@ -6990,15 +6990,17 @@ * // => ['x', 'y'] (property order is not guaranteed across environments) */ var keys = !nativeKeys ? shimKeys : function(object) { - var Ctor = object && object.constructor, - length = object ? object.length : 0; + object = Object(object); + + var Ctor = object.constructor, + length = object.length; if ((Ctor && object === Ctor.prototype) || (typeof length == 'number' && length > 0) || (support.enumPrototypes && typeof object == 'function')) { return shimKeys(object); } - return isObject(object) ? nativeKeys(object) : []; + return nativeKeys(object); }; /** @@ -7022,9 +7024,8 @@ * // => ['x', 'y', 'z'] (property order is not guaranteed across environments) */ function keysIn(object) { - if (!isObject(object)) { - return []; - } + object = Object(object); + var length = object.length; length = (typeof length == 'number' && length > 0 && (isArray(object) || (support.nonEnumStrings && isString(object)) || diff --git a/test/test.js b/test/test.js index d305fc288..68a5195dd 100644 --- a/test/test.js +++ b/test/test.js @@ -5721,6 +5721,11 @@ deepEqual(actual.sort(), ['a', 'b']); }); + test('`_.' + methodName + '` should coerce primitives to objects', 1, function() { + var actual = func('abc'); + deepEqual(actual.sort(), ['0', '1', '2']); + }); + test('`_.' + methodName + '` should treat sparse arrays as dense', 1, function() { var array = [1]; array[2] = 3; @@ -5729,7 +5734,7 @@ deepEqual(actual.sort(), ['0', '1', '2']); }); - test('`_.' + methodName + '` should custom properties on arrays', 1, function() { + test('`_.' + methodName + '` should return keys for custom properties on arrays', 1, function() { var array = [1]; array.a = 1; @@ -5755,7 +5760,7 @@ } }); - test('`_.' + methodName + '` should custom properties on `arguments` objects', 1, function() { + test('`_.' + methodName + '` should return keys for custom properties on `arguments` objects', 1, function() { if (!(isPhantom || isStrict)) { args.a = 1; var actual = func(args); @@ -5785,7 +5790,7 @@ deepEqual(actual.sort(), ['0', '1', '2']); }); - test('`_.' + methodName + '` should custom properties on string objects', 1, function() { + test('`_.' + methodName + '` should return keys for custom properties on string objects', 1, function() { var object = Object('a'); object.a = 1; diff --git a/test/underscore.html b/test/underscore.html index 6fd4805c3..73f147b25 100644 --- a/test/underscore.html +++ b/test/underscore.html @@ -110,7 +110,8 @@ 'Died on test #63' ], 'keys': [ - 'is not fooled by sparse arrays; see issue #95' + 'is not fooled by sparse arrays; see issue #95', + '[]' ], 'omit': [ 'can accept a predicate'