Align _.keys with ES6 and coerce primitives to objects.

This commit is contained in:
John-David Dalton
2014-06-16 12:27:21 -07:00
parent 4f9da35b76
commit 73f6fd49d0
4 changed files with 26 additions and 18 deletions

17
dist/lodash.js vendored
View File

@@ -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;

View File

@@ -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)) ||

View File

@@ -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;

View File

@@ -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'