diff --git a/README.md b/README.md
index e5bf2d5b1..f76f7fbd1 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# lodash-amd v4.5.0
+# lodash-amd v4.5.1
The [lodash](https://lodash.com/) library exported as [AMD](https://github.com/amdjs/amdjs-api/wiki/AMD) modules.
@@ -27,4 +27,4 @@ require({
});
```
-See the [package source](https://github.com/lodash/lodash/tree/4.5.0-amd) for more details.
+See the [package source](https://github.com/lodash/lodash/tree/4.5.1-amd) for more details.
diff --git a/_assignValue.js b/_assignValue.js
index 96177477d..c93e69b4b 100644
--- a/_assignValue.js
+++ b/_assignValue.js
@@ -21,8 +21,7 @@ define(['./eq'], function(eq) {
*/
function assignValue(object, key, value) {
var objValue = object[key];
- if ((!eq(objValue, value) ||
- (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) ||
+ if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
(value === undefined && !(key in object))) {
object[key] = value;
}
diff --git a/_composeArgs.js b/_composeArgs.js
index 235cb8b16..4674a784c 100644
--- a/_composeArgs.js
+++ b/_composeArgs.js
@@ -11,23 +11,28 @@ define([], function() {
* @param {Array|Object} args The provided arguments.
* @param {Array} partials The arguments to prepend to those provided.
* @param {Array} holders The `partials` placeholder indexes.
+ * @params {boolean} [isCurried] Specify composing for a curried function.
* @returns {Array} Returns the new array of composed arguments.
*/
- function composeArgs(args, partials, holders) {
- var holdersLength = holders.length,
- argsIndex = -1,
- argsLength = nativeMax(args.length - holdersLength, 0),
+ function composeArgs(args, partials, holders, isCurried) {
+ var argsIndex = -1,
+ argsLength = args.length,
+ holdersLength = holders.length,
leftIndex = -1,
leftLength = partials.length,
- result = Array(leftLength + argsLength);
+ rangeLength = nativeMax(argsLength - holdersLength, 0),
+ result = Array(leftLength + rangeLength),
+ isUncurried = !isCurried;
while (++leftIndex < leftLength) {
result[leftIndex] = partials[leftIndex];
}
while (++argsIndex < holdersLength) {
- result[holders[argsIndex]] = args[argsIndex];
+ if (isUncurried || argsIndex < argsLength) {
+ result[holders[argsIndex]] = args[argsIndex];
+ }
}
- while (argsLength--) {
+ while (rangeLength--) {
result[leftIndex++] = args[argsIndex++];
}
return result;
diff --git a/_composeArgsRight.js b/_composeArgsRight.js
index be4623131..6c592268f 100644
--- a/_composeArgsRight.js
+++ b/_composeArgsRight.js
@@ -11,18 +11,21 @@ define([], function() {
* @param {Array|Object} args The provided arguments.
* @param {Array} partials The arguments to append to those provided.
* @param {Array} holders The `partials` placeholder indexes.
+ * @params {boolean} [isCurried] Specify composing for a curried function.
* @returns {Array} Returns the new array of composed arguments.
*/
- function composeArgsRight(args, partials, holders) {
- var holdersIndex = -1,
+ function composeArgsRight(args, partials, holders, isCurried) {
+ var argsIndex = -1,
+ argsLength = args.length,
+ holdersIndex = -1,
holdersLength = holders.length,
- argsIndex = -1,
- argsLength = nativeMax(args.length - holdersLength, 0),
rightIndex = -1,
rightLength = partials.length,
- result = Array(argsLength + rightLength);
+ rangeLength = nativeMax(argsLength - holdersLength, 0),
+ result = Array(rangeLength + rightLength),
+ isUncurried = !isCurried;
- while (++argsIndex < argsLength) {
+ while (++argsIndex < rangeLength) {
result[argsIndex] = args[argsIndex];
}
var offset = argsIndex;
@@ -30,7 +33,9 @@ define([], function() {
result[offset + rightIndex] = partials[rightIndex];
}
while (++holdersIndex < holdersLength) {
- result[offset + holders[holdersIndex]] = args[argsIndex++];
+ if (isUncurried || argsIndex < argsLength) {
+ result[offset + holders[holdersIndex]] = args[argsIndex++];
+ }
}
return result;
}
diff --git a/_countHolders.js b/_countHolders.js
new file mode 100644
index 000000000..9905d0ca6
--- /dev/null
+++ b/_countHolders.js
@@ -0,0 +1,24 @@
+define([], function() {
+
+ /**
+ * Gets the number of `placeholder` occurrences in `array`.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {*} placeholder The placeholder to search for.
+ * @returns {number} Returns the placeholder count.
+ */
+ function countHolders(array, placeholder) {
+ var length = array.length,
+ result = 0;
+
+ while (length--) {
+ if (array[length] === placeholder) {
+ result++;
+ }
+ }
+ return result;
+ }
+
+ return countHolders;
+});
diff --git a/_createCurryWrapper.js b/_createCurryWrapper.js
index c1f9c1ab8..dea871ef6 100644
--- a/_createCurryWrapper.js
+++ b/_createCurryWrapper.js
@@ -1,4 +1,4 @@
-define(['./_apply', './_createCtorWrapper', './_createHybridWrapper', './_createRecurryWrapper', './_replaceHolders', './_root'], function(apply, createCtorWrapper, createHybridWrapper, createRecurryWrapper, replaceHolders, root) {
+define(['./_apply', './_createCtorWrapper', './_createHybridWrapper', './_createRecurryWrapper', './_getPlaceholder', './_replaceHolders', './_root'], function(apply, createCtorWrapper, createHybridWrapper, createRecurryWrapper, getPlaceholder, replaceHolders, root) {
/** Used as a safe reference for `undefined` in pre-ES5 environments. */
var undefined;
@@ -17,10 +17,9 @@ define(['./_apply', './_createCtorWrapper', './_createHybridWrapper', './_create
function wrapper() {
var length = arguments.length,
- index = length,
args = Array(length),
- fn = (this && this !== root && this instanceof wrapper) ? Ctor : func,
- placeholder = wrapper.placeholder;
+ index = length,
+ placeholder = getPlaceholder(wrapper);
while (index--) {
args[index] = arguments[index];
@@ -30,9 +29,13 @@ define(['./_apply', './_createCtorWrapper', './_createHybridWrapper', './_create
: replaceHolders(args, placeholder);
length -= holders.length;
- return length < arity
- ? createRecurryWrapper(func, bitmask, createHybridWrapper, placeholder, undefined, args, holders, undefined, undefined, arity - length)
- : apply(fn, this, args);
+ if (length < arity) {
+ return createRecurryWrapper(
+ func, bitmask, createHybridWrapper, wrapper.placeholder, undefined,
+ args, holders, undefined, undefined, arity - length);
+ }
+ var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
+ return apply(fn, this, args);
}
return wrapper;
}
diff --git a/_createHybridWrapper.js b/_createHybridWrapper.js
index 42e8025d0..84b01f340 100644
--- a/_createHybridWrapper.js
+++ b/_createHybridWrapper.js
@@ -1,4 +1,4 @@
-define(['./_composeArgs', './_composeArgsRight', './_createCtorWrapper', './_createRecurryWrapper', './_reorder', './_replaceHolders', './_root'], function(composeArgs, composeArgsRight, createCtorWrapper, createRecurryWrapper, reorder, replaceHolders, root) {
+define(['./_composeArgs', './_composeArgsRight', './_countHolders', './_createCtorWrapper', './_createRecurryWrapper', './_getPlaceholder', './_reorder', './_replaceHolders', './_root'], function(composeArgs, composeArgsRight, countHolders, createCtorWrapper, createRecurryWrapper, getPlaceholder, reorder, replaceHolders, root) {
/** Used as a safe reference for `undefined` in pre-ES5 environments. */
var undefined;
@@ -32,8 +32,7 @@ define(['./_composeArgs', './_composeArgsRight', './_createCtorWrapper', './_cre
var isAry = bitmask & ARY_FLAG,
isBind = bitmask & BIND_FLAG,
isBindKey = bitmask & BIND_KEY_FLAG,
- isCurry = bitmask & CURRY_FLAG,
- isCurryRight = bitmask & CURRY_RIGHT_FLAG,
+ isCurried = bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG),
isFlip = bitmask & FLIP_FLAG,
Ctor = isBindKey ? undefined : createCtorWrapper(func);
@@ -45,33 +44,34 @@ define(['./_composeArgs', './_composeArgsRight', './_createCtorWrapper', './_cre
while (index--) {
args[index] = arguments[index];
}
+ if (isCurried) {
+ var placeholder = getPlaceholder(wrapper),
+ holdersCount = countHolders(args, placeholder);
+ }
if (partials) {
- args = composeArgs(args, partials, holders);
+ args = composeArgs(args, partials, holders, isCurried);
}
if (partialsRight) {
- args = composeArgsRight(args, partialsRight, holdersRight);
+ args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
}
- if (isCurry || isCurryRight) {
- var placeholder = wrapper.placeholder,
- argsHolders = replaceHolders(args, placeholder);
-
- length -= argsHolders.length;
- if (length < arity) {
- return createRecurryWrapper(
- func, bitmask, createHybridWrapper, placeholder, thisArg, args,
- argsHolders, argPos, ary, arity - length
- );
- }
+ length -= holdersCount;
+ if (isCurried && length < arity) {
+ var newHolders = replaceHolders(args, placeholder);
+ return createRecurryWrapper(
+ func, bitmask, createHybridWrapper, wrapper.placeholder, thisArg,
+ args, newHolders, argPos, ary, arity - length
+ );
}
var thisBinding = isBind ? thisArg : this,
fn = isBindKey ? thisBinding[func] : func;
+ length = args.length;
if (argPos) {
args = reorder(args, argPos);
- } else if (isFlip && args.length > 1) {
+ } else if (isFlip && length > 1) {
args.reverse();
}
- if (isAry && ary < args.length) {
+ if (isAry && ary < length) {
args.length = ary;
}
if (this && this !== root && this instanceof wrapper) {
diff --git a/_createRecurryWrapper.js b/_createRecurryWrapper.js
index d1fc1e6a9..b6bc26a86 100644
--- a/_createRecurryWrapper.js
+++ b/_createRecurryWrapper.js
@@ -18,7 +18,7 @@ define(['./_copyArray', './_isLaziable', './_setData'], function(copyArray, isLa
* @param {Function} func The function to wrap.
* @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details.
* @param {Function} wrapFunc The function to create the `func` wrapper.
- * @param {*} placeholder The placeholder to replace.
+ * @param {*} placeholder The placeholder value.
* @param {*} [thisArg] The `this` binding of `func`.
* @param {Array} [partials] The arguments to prepend to those provided to the new function.
* @param {Array} [holders] The `partials` placeholder indexes.
@@ -30,7 +30,7 @@ define(['./_copyArray', './_isLaziable', './_setData'], function(copyArray, isLa
function createRecurryWrapper(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
var isCurry = bitmask & CURRY_FLAG,
newArgPos = argPos ? copyArray(argPos) : undefined,
- newsHolders = isCurry ? holders : undefined,
+ newHolders = isCurry ? holders : undefined,
newHoldersRight = isCurry ? undefined : holders,
newPartials = isCurry ? partials : undefined,
newPartialsRight = isCurry ? undefined : partials;
@@ -42,7 +42,7 @@ define(['./_copyArray', './_isLaziable', './_setData'], function(copyArray, isLa
bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);
}
var newData = [
- func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight,
+ func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
newHoldersRight, newArgPos, ary, arity
];
diff --git a/_getPlaceholder.js b/_getPlaceholder.js
new file mode 100644
index 000000000..b04652899
--- /dev/null
+++ b/_getPlaceholder.js
@@ -0,0 +1,16 @@
+define([], function() {
+
+ /**
+ * Gets the argument placeholder value for `func`.
+ *
+ * @private
+ * @param {Function} func The function to inspect.
+ * @returns {*} Returns the placeholder value.
+ */
+ function getPlaceholder(func) {
+ var object = func;
+ return object.placeholder;
+ }
+
+ return getPlaceholder;
+});
diff --git a/_initCloneObject.js b/_initCloneObject.js
index cf4085533..ca7c94b21 100644
--- a/_initCloneObject.js
+++ b/_initCloneObject.js
@@ -1,7 +1,7 @@
define(['./_baseCreate', './isFunction', './_isPrototype'], function(baseCreate, isFunction, isPrototype) {
- /** Used as a safe reference for `undefined` in pre-ES5 environments. */
- var undefined;
+ /** Built-in value references. */
+ var getPrototypeOf = Object.getPrototypeOf;
/**
* Initializes an object clone.
@@ -11,11 +11,9 @@ define(['./_baseCreate', './isFunction', './_isPrototype'], function(baseCreate,
* @returns {Object} Returns the initialized clone.
*/
function initCloneObject(object) {
- if (isPrototype(object)) {
- return {};
- }
- var Ctor = object.constructor;
- return baseCreate(isFunction(Ctor) ? Ctor.prototype : undefined);
+ return (isFunction(object.constructor) && !isPrototype(object))
+ ? baseCreate(getPrototypeOf(object))
+ : {};
}
return initCloneObject;
diff --git a/_isPrototype.js b/_isPrototype.js
index d57affdb9..ad0469e4a 100644
--- a/_isPrototype.js
+++ b/_isPrototype.js
@@ -1,4 +1,4 @@
-define([], function() {
+define(['./isFunction'], function(isFunction) {
/** Used for built-in method references. */
var objectProto = Object.prototype;
@@ -12,7 +12,7 @@ define([], function() {
*/
function isPrototype(value) {
var Ctor = value && value.constructor,
- proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
+ proto = (isFunction(Ctor) && Ctor.prototype) || objectProto;
return value === proto;
}
diff --git a/_mergeData.js b/_mergeData.js
index 269d2fb23..dcd00d74f 100644
--- a/_mergeData.js
+++ b/_mergeData.js
@@ -36,9 +36,9 @@ define(['./_composeArgs', './_composeArgsRight', './_copyArray', './_replaceHold
isCommon = newBitmask < (BIND_FLAG | BIND_KEY_FLAG | ARY_FLAG);
var isCombo =
- (srcBitmask == ARY_FLAG && (bitmask == CURRY_FLAG)) ||
- (srcBitmask == ARY_FLAG && (bitmask == REARG_FLAG) && (data[7].length <= source[8])) ||
- (srcBitmask == (ARY_FLAG | REARG_FLAG) && (source[7].length <= source[8]) && (bitmask == CURRY_FLAG));
+ ((srcBitmask == ARY_FLAG) && (bitmask == CURRY_FLAG)) ||
+ ((srcBitmask == ARY_FLAG) && (bitmask == REARG_FLAG) && (data[7].length <= source[8])) ||
+ ((srcBitmask == (ARY_FLAG | REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == CURRY_FLAG));
// Exit early if metadata can't be merged.
if (!(isCommon || isCombo)) {
@@ -48,7 +48,7 @@ define(['./_composeArgs', './_composeArgsRight', './_copyArray', './_replaceHold
if (srcBitmask & BIND_FLAG) {
data[2] = source[2];
// Set when currying a bound function.
- newBitmask |= (bitmask & BIND_FLAG) ? 0 : CURRY_BOUND_FLAG;
+ newBitmask |= bitmask & BIND_FLAG ? 0 : CURRY_BOUND_FLAG;
}
// Compose partial arguments.
var value = source[3];
diff --git a/_replaceHolders.js b/_replaceHolders.js
index 0d6d9f55c..3cfcb4141 100644
--- a/_replaceHolders.js
+++ b/_replaceHolders.js
@@ -19,7 +19,8 @@ define([], function() {
result = [];
while (++index < length) {
- if (array[index] === placeholder) {
+ var value = array[index];
+ if (value === placeholder || value === PLACEHOLDER) {
array[index] = PLACEHOLDER;
result[++resIndex] = index;
}
diff --git a/bind.js b/bind.js
index ab8096d1c..0f5eecdbb 100644
--- a/bind.js
+++ b/bind.js
@@ -1,4 +1,4 @@
-define(['./_createWrapper', './_replaceHolders', './rest'], function(createWrapper, replaceHolders, rest) {
+define(['./_createWrapper', './_getPlaceholder', './_replaceHolders', './rest'], function(createWrapper, getPlaceholder, replaceHolders, rest) {
/** Used to compose bitmasks for wrapper metadata. */
var BIND_FLAG = 1,
@@ -42,9 +42,7 @@ define(['./_createWrapper', './_replaceHolders', './rest'], function(createWrapp
var bind = rest(function(func, thisArg, partials) {
var bitmask = BIND_FLAG;
if (partials.length) {
- var placeholder = bind.placeholder,
- holders = replaceHolders(partials, placeholder);
-
+ var holders = replaceHolders(partials, getPlaceholder(bind));
bitmask |= PARTIAL_FLAG;
}
return createWrapper(func, bitmask, thisArg, partials, holders);
diff --git a/bindKey.js b/bindKey.js
index ae9be8963..d65175cb8 100644
--- a/bindKey.js
+++ b/bindKey.js
@@ -1,4 +1,4 @@
-define(['./_createWrapper', './_replaceHolders', './rest'], function(createWrapper, replaceHolders, rest) {
+define(['./_createWrapper', './_getPlaceholder', './_replaceHolders', './rest'], function(createWrapper, getPlaceholder, replaceHolders, rest) {
/** Used to compose bitmasks for wrapper metadata. */
var BIND_FLAG = 1,
@@ -52,9 +52,7 @@ define(['./_createWrapper', './_replaceHolders', './rest'], function(createWrapp
var bindKey = rest(function(object, key, partials) {
var bitmask = BIND_FLAG | BIND_KEY_FLAG;
if (partials.length) {
- var placeholder = bindKey.placeholder,
- holders = replaceHolders(partials, placeholder);
-
+ var holders = replaceHolders(partials, getPlaceholder(bindKey));
bitmask |= PARTIAL_FLAG;
}
return createWrapper(key, bitmask, object, partials, holders);
diff --git a/isError.js b/isError.js
index 0ef064984..cb7e9d779 100644
--- a/isError.js
+++ b/isError.js
@@ -33,9 +33,8 @@ define(['./isObjectLike'], function(isObjectLike) {
if (!isObjectLike(value)) {
return false;
}
- var Ctor = value.constructor;
return (objectToString.call(value) == errorTag) ||
- (typeof Ctor == 'function' && objectToString.call(Ctor.prototype) == errorTag);
+ (typeof value.message == 'string' && typeof value.name == 'string');
}
return isError;
diff --git a/isPlainObject.js b/isPlainObject.js
index e677fb177..0491de540 100644
--- a/isPlainObject.js
+++ b/isPlainObject.js
@@ -53,10 +53,7 @@ define(['./_isHostObject', './isObjectLike'], function(isHostObject, isObjectLik
objectToString.call(value) != objectTag || isHostObject(value)) {
return false;
}
- var proto = objectProto;
- if (typeof value.constructor == 'function') {
- proto = getPrototypeOf(value);
- }
+ var proto = getPrototypeOf(value);
if (proto === null) {
return true;
}
diff --git a/main.js b/main.js
index 93244a823..f42bf99bb 100644
--- a/main.js
+++ b/main.js
@@ -1,6 +1,6 @@
/**
* @license
- * lodash 4.5.0 (Custom Build)
+ * lodash 4.5.1 (Custom Build)
* Build: `lodash exports="amd" -d -o ./main.js`
* Copyright 2012-2016 The Dojo Foundation
* Based on Underscore.js 1.8.3
@@ -13,7 +13,7 @@
var undefined;
/** Used as the semantic version number. */
- var VERSION = '4.5.0';
+ var VERSION = '4.5.1';
/** Used to compose bitmasks for wrapper metadata. */
var BIND_FLAG = 1,
@@ -1033,6 +1033,26 @@
return object.index - other.index;
}
+ /**
+ * Gets the number of `placeholder` occurrences in `array`.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {*} placeholder The placeholder to search for.
+ * @returns {number} Returns the placeholder count.
+ */
+ function countHolders(array, placeholder) {
+ var length = array.length,
+ result = 0;
+
+ while (length--) {
+ if (array[length] === placeholder) {
+ result++;
+ }
+ }
+ return result;
+ }
+
/**
* Used by `_.deburr` to convert latin-1 supplementary letters to basic latin letters.
*
@@ -1171,7 +1191,8 @@
result = [];
while (++index < length) {
- if (array[index] === placeholder) {
+ var value = array[index];
+ if (value === placeholder || value === PLACEHOLDER) {
array[index] = PLACEHOLDER;
result[++resIndex] = index;
}
@@ -2161,8 +2182,7 @@
*/
function assignValue(object, key, value) {
var objValue = object[key];
- if ((!eq(objValue, value) ||
- (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) ||
+ if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
(value === undefined && !(key in object))) {
object[key] = value;
}
@@ -3872,23 +3892,28 @@
* @param {Array|Object} args The provided arguments.
* @param {Array} partials The arguments to prepend to those provided.
* @param {Array} holders The `partials` placeholder indexes.
+ * @params {boolean} [isCurried] Specify composing for a curried function.
* @returns {Array} Returns the new array of composed arguments.
*/
- function composeArgs(args, partials, holders) {
- var holdersLength = holders.length,
- argsIndex = -1,
- argsLength = nativeMax(args.length - holdersLength, 0),
+ function composeArgs(args, partials, holders, isCurried) {
+ var argsIndex = -1,
+ argsLength = args.length,
+ holdersLength = holders.length,
leftIndex = -1,
leftLength = partials.length,
- result = Array(leftLength + argsLength);
+ rangeLength = nativeMax(argsLength - holdersLength, 0),
+ result = Array(leftLength + rangeLength),
+ isUncurried = !isCurried;
while (++leftIndex < leftLength) {
result[leftIndex] = partials[leftIndex];
}
while (++argsIndex < holdersLength) {
- result[holders[argsIndex]] = args[argsIndex];
+ if (isUncurried || argsIndex < argsLength) {
+ result[holders[argsIndex]] = args[argsIndex];
+ }
}
- while (argsLength--) {
+ while (rangeLength--) {
result[leftIndex++] = args[argsIndex++];
}
return result;
@@ -3902,18 +3927,21 @@
* @param {Array|Object} args The provided arguments.
* @param {Array} partials The arguments to append to those provided.
* @param {Array} holders The `partials` placeholder indexes.
+ * @params {boolean} [isCurried] Specify composing for a curried function.
* @returns {Array} Returns the new array of composed arguments.
*/
- function composeArgsRight(args, partials, holders) {
- var holdersIndex = -1,
+ function composeArgsRight(args, partials, holders, isCurried) {
+ var argsIndex = -1,
+ argsLength = args.length,
+ holdersIndex = -1,
holdersLength = holders.length,
- argsIndex = -1,
- argsLength = nativeMax(args.length - holdersLength, 0),
rightIndex = -1,
rightLength = partials.length,
- result = Array(argsLength + rightLength);
+ rangeLength = nativeMax(argsLength - holdersLength, 0),
+ result = Array(rangeLength + rightLength),
+ isUncurried = !isCurried;
- while (++argsIndex < argsLength) {
+ while (++argsIndex < rangeLength) {
result[argsIndex] = args[argsIndex];
}
var offset = argsIndex;
@@ -3921,7 +3949,9 @@
result[offset + rightIndex] = partials[rightIndex];
}
while (++holdersIndex < holdersLength) {
- result[offset + holders[holdersIndex]] = args[argsIndex++];
+ if (isUncurried || argsIndex < argsLength) {
+ result[offset + holders[holdersIndex]] = args[argsIndex++];
+ }
}
return result;
}
@@ -4205,10 +4235,9 @@
function wrapper() {
var length = arguments.length,
- index = length,
args = Array(length),
- fn = (this && this !== root && this instanceof wrapper) ? Ctor : func,
- placeholder = lodash.placeholder || wrapper.placeholder;
+ index = length,
+ placeholder = getPlaceholder(wrapper);
while (index--) {
args[index] = arguments[index];
@@ -4218,9 +4247,13 @@
: replaceHolders(args, placeholder);
length -= holders.length;
- return length < arity
- ? createRecurryWrapper(func, bitmask, createHybridWrapper, placeholder, undefined, args, holders, undefined, undefined, arity - length)
- : apply(fn, this, args);
+ if (length < arity) {
+ return createRecurryWrapper(
+ func, bitmask, createHybridWrapper, wrapper.placeholder, undefined,
+ args, holders, undefined, undefined, arity - length);
+ }
+ var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
+ return apply(fn, this, args);
}
return wrapper;
}
@@ -4308,8 +4341,7 @@
var isAry = bitmask & ARY_FLAG,
isBind = bitmask & BIND_FLAG,
isBindKey = bitmask & BIND_KEY_FLAG,
- isCurry = bitmask & CURRY_FLAG,
- isCurryRight = bitmask & CURRY_RIGHT_FLAG,
+ isCurried = bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG),
isFlip = bitmask & FLIP_FLAG,
Ctor = isBindKey ? undefined : createCtorWrapper(func);
@@ -4321,33 +4353,34 @@
while (index--) {
args[index] = arguments[index];
}
+ if (isCurried) {
+ var placeholder = getPlaceholder(wrapper),
+ holdersCount = countHolders(args, placeholder);
+ }
if (partials) {
- args = composeArgs(args, partials, holders);
+ args = composeArgs(args, partials, holders, isCurried);
}
if (partialsRight) {
- args = composeArgsRight(args, partialsRight, holdersRight);
+ args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
}
- if (isCurry || isCurryRight) {
- var placeholder = lodash.placeholder || wrapper.placeholder,
- argsHolders = replaceHolders(args, placeholder);
-
- length -= argsHolders.length;
- if (length < arity) {
- return createRecurryWrapper(
- func, bitmask, createHybridWrapper, placeholder, thisArg, args,
- argsHolders, argPos, ary, arity - length
- );
- }
+ length -= holdersCount;
+ if (isCurried && length < arity) {
+ var newHolders = replaceHolders(args, placeholder);
+ return createRecurryWrapper(
+ func, bitmask, createHybridWrapper, wrapper.placeholder, thisArg,
+ args, newHolders, argPos, ary, arity - length
+ );
}
var thisBinding = isBind ? thisArg : this,
fn = isBindKey ? thisBinding[func] : func;
+ length = args.length;
if (argPos) {
args = reorder(args, argPos);
- } else if (isFlip && args.length > 1) {
+ } else if (isFlip && length > 1) {
args.reverse();
}
- if (isAry && ary < args.length) {
+ if (isAry && ary < length) {
args.length = ary;
}
if (this && this !== root && this instanceof wrapper) {
@@ -4485,7 +4518,7 @@
* @param {Function} func The function to wrap.
* @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details.
* @param {Function} wrapFunc The function to create the `func` wrapper.
- * @param {*} placeholder The placeholder to replace.
+ * @param {*} placeholder The placeholder value.
* @param {*} [thisArg] The `this` binding of `func`.
* @param {Array} [partials] The arguments to prepend to those provided to the new function.
* @param {Array} [holders] The `partials` placeholder indexes.
@@ -4497,7 +4530,7 @@
function createRecurryWrapper(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
var isCurry = bitmask & CURRY_FLAG,
newArgPos = argPos ? copyArray(argPos) : undefined,
- newsHolders = isCurry ? holders : undefined,
+ newHolders = isCurry ? holders : undefined,
newHoldersRight = isCurry ? undefined : holders,
newPartials = isCurry ? partials : undefined,
newPartialsRight = isCurry ? undefined : partials;
@@ -4509,7 +4542,7 @@
bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);
}
var newData = [
- func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight,
+ func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
newHoldersRight, newArgPos, ary, arity
];
@@ -4930,6 +4963,18 @@
return isNative(value) ? value : undefined;
}
+ /**
+ * Gets the argument placeholder value for `func`.
+ *
+ * @private
+ * @param {Function} func The function to inspect.
+ * @returns {*} Returns the placeholder value.
+ */
+ function getPlaceholder(func) {
+ var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;
+ return object.placeholder;
+ }
+
/**
* Creates an array of the own symbol properties of `object`.
*
@@ -5056,11 +5101,9 @@
* @returns {Object} Returns the initialized clone.
*/
function initCloneObject(object) {
- if (isPrototype(object)) {
- return {};
- }
- var Ctor = object.constructor;
- return baseCreate(isFunction(Ctor) ? Ctor.prototype : undefined);
+ return (isFunction(object.constructor) && !isPrototype(object))
+ ? baseCreate(getPrototypeOf(object))
+ : {};
}
/**
@@ -5207,7 +5250,7 @@
*/
function isPrototype(value) {
var Ctor = value && value.constructor,
- proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
+ proto = (isFunction(Ctor) && Ctor.prototype) || objectProto;
return value === proto;
}
@@ -5246,9 +5289,9 @@
isCommon = newBitmask < (BIND_FLAG | BIND_KEY_FLAG | ARY_FLAG);
var isCombo =
- (srcBitmask == ARY_FLAG && (bitmask == CURRY_FLAG)) ||
- (srcBitmask == ARY_FLAG && (bitmask == REARG_FLAG) && (data[7].length <= source[8])) ||
- (srcBitmask == (ARY_FLAG | REARG_FLAG) && (source[7].length <= source[8]) && (bitmask == CURRY_FLAG));
+ ((srcBitmask == ARY_FLAG) && (bitmask == CURRY_FLAG)) ||
+ ((srcBitmask == ARY_FLAG) && (bitmask == REARG_FLAG) && (data[7].length <= source[8])) ||
+ ((srcBitmask == (ARY_FLAG | REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == CURRY_FLAG));
// Exit early if metadata can't be merged.
if (!(isCommon || isCombo)) {
@@ -5258,7 +5301,7 @@
if (srcBitmask & BIND_FLAG) {
data[2] = source[2];
// Set when currying a bound function.
- newBitmask |= (bitmask & BIND_FLAG) ? 0 : CURRY_BOUND_FLAG;
+ newBitmask |= bitmask & BIND_FLAG ? 0 : CURRY_BOUND_FLAG;
}
// Compose partial arguments.
var value = source[3];
@@ -6190,7 +6233,8 @@
* [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
* for equality comparisons.
*
- * **Note:** Unlike `_.without`, this method mutates `array`.
+ * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
+ * to remove elements from an array by predicate.
*
* @static
* @memberOf _
@@ -6295,10 +6339,11 @@
/**
* Removes all elements from `array` that `predicate` returns truthy for
- * and returns an array of the removed elements. The predicate is invoked with
- * three arguments: (value, index, array).
+ * and returns an array of the removed elements. The predicate is invoked
+ * with three arguments: (value, index, array).
*
- * **Note:** Unlike `_.filter`, this method mutates `array`.
+ * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
+ * to pull elements from an array by value.
*
* @static
* @memberOf _
@@ -8461,9 +8506,7 @@
var bind = rest(function(func, thisArg, partials) {
var bitmask = BIND_FLAG;
if (partials.length) {
- var placeholder = lodash.placeholder || bind.placeholder,
- holders = replaceHolders(partials, placeholder);
-
+ var holders = replaceHolders(partials, getPlaceholder(bind));
bitmask |= PARTIAL_FLAG;
}
return createWrapper(func, bitmask, thisArg, partials, holders);
@@ -8516,9 +8559,7 @@
var bindKey = rest(function(object, key, partials) {
var bitmask = BIND_FLAG | BIND_KEY_FLAG;
if (partials.length) {
- var placeholder = lodash.placeholder || bindKey.placeholder,
- holders = replaceHolders(partials, placeholder);
-
+ var holders = replaceHolders(partials, getPlaceholder(bindKey));
bitmask |= PARTIAL_FLAG;
}
return createWrapper(key, bitmask, object, partials, holders);
@@ -8567,7 +8608,7 @@
function curry(func, arity, guard) {
arity = guard ? undefined : arity;
var result = createWrapper(func, CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
- result.placeholder = lodash.placeholder || curry.placeholder;
+ result.placeholder = curry.placeholder;
return result;
}
@@ -8611,7 +8652,7 @@
function curryRight(func, arity, guard) {
arity = guard ? undefined : arity;
var result = createWrapper(func, CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
- result.placeholder = lodash.placeholder || curryRight.placeholder;
+ result.placeholder = curryRight.placeholder;
return result;
}
@@ -9035,9 +9076,7 @@
* // => 'hi fred'
*/
var partial = rest(function(func, partials) {
- var placeholder = lodash.placeholder || partial.placeholder,
- holders = replaceHolders(partials, placeholder);
-
+ var holders = replaceHolders(partials, getPlaceholder(partial));
return createWrapper(func, PARTIAL_FLAG, undefined, partials, holders);
});
@@ -9073,9 +9112,7 @@
* // => 'hello fred'
*/
var partialRight = rest(function(func, partials) {
- var placeholder = lodash.placeholder || partialRight.placeholder,
- holders = replaceHolders(partials, placeholder);
-
+ var holders = replaceHolders(partials, getPlaceholder(partialRight));
return createWrapper(func, PARTIAL_RIGHT_FLAG, undefined, partials, holders);
});
@@ -9874,9 +9911,8 @@
if (!isObjectLike(value)) {
return false;
}
- var Ctor = value.constructor;
return (objectToString.call(value) == errorTag) ||
- (typeof Ctor == 'function' && objectToString.call(Ctor.prototype) == errorTag);
+ (typeof value.message == 'string' && typeof value.name == 'string');
}
/**
@@ -10289,10 +10325,7 @@
objectToString.call(value) != objectTag || isHostObject(value)) {
return false;
}
- var proto = objectProto;
- if (typeof value.constructor == 'function') {
- proto = getPrototypeOf(value);
- }
+ var proto = getPrototypeOf(value);
if (proto === null) {
return true;
}
@@ -11506,7 +11539,8 @@
/**
* The opposite of `_.mapValues`; this method creates an object with the
* same values as `object` and keys generated by running each own enumerable
- * property of `object` through `iteratee`.
+ * property of `object` through `iteratee`. The iteratee is invoked with
+ * three arguments: (value, key, object).
*
* @static
* @memberOf _
@@ -11534,7 +11568,7 @@
/**
* Creates an object with the same keys as `object` and values generated by
* running each own enumerable property of `object` through `iteratee`. The
- * iteratee function is invoked with three arguments: (value, key, object).
+ * iteratee is invoked with three arguments: (value, key, object).
*
* @static
* @memberOf _
@@ -11667,9 +11701,10 @@
});
/**
- * The opposite of `_.pickBy`; this method creates an object composed of the
- * own and inherited enumerable properties of `object` that `predicate`
- * doesn't return truthy for.
+ * The opposite of `_.pickBy`; this method creates an object composed of
+ * the own and inherited enumerable properties of `object` that `predicate`
+ * doesn't return truthy for. The predicate is invoked with two arguments:
+ * (value, key).
*
* @static
* @memberOf _
@@ -11685,7 +11720,7 @@
* // => { 'b': '2' }
*/
function omitBy(object, predicate) {
- predicate = getIteratee(predicate, 2);
+ predicate = getIteratee(predicate);
return basePickBy(object, function(value, key) {
return !predicate(value, key);
});
@@ -11730,7 +11765,7 @@
* // => { 'a': 1, 'c': 3 }
*/
function pickBy(object, predicate) {
- return object == null ? {} : basePickBy(object, getIteratee(predicate, 2));
+ return object == null ? {} : basePickBy(object, getIteratee(predicate));
}
/**
@@ -11920,7 +11955,7 @@
if (isArr) {
accumulator = isArray(object) ? new Ctor : [];
} else {
- accumulator = baseCreate(isFunction(Ctor) ? Ctor.prototype : undefined);
+ accumulator = isFunction(Ctor) ? baseCreate(getPrototypeOf(object)) : {};
}
} else {
accumulator = {};
@@ -13916,8 +13951,8 @@
var rangeRight = createRange(true);
/**
- * Invokes the iteratee function `n` times, returning an array of the results
- * of each invocation. The iteratee is invoked with one argument; (index).
+ * Invokes the iteratee `n` times, returning an array of the results of
+ * each invocation. The iteratee is invoked with one argument; (index).
*
* @static
* @memberOf _
diff --git a/mapKeys.js b/mapKeys.js
index 3b8c589c8..6d2e4d2c8 100644
--- a/mapKeys.js
+++ b/mapKeys.js
@@ -3,7 +3,8 @@ define(['./_baseForOwn', './_baseIteratee'], function(baseForOwn, baseIteratee)
/**
* The opposite of `_.mapValues`; this method creates an object with the
* same values as `object` and keys generated by running each own enumerable
- * property of `object` through `iteratee`.
+ * property of `object` through `iteratee`. The iteratee is invoked with
+ * three arguments: (value, key, object).
*
* @static
* @memberOf _
diff --git a/mapValues.js b/mapValues.js
index 5587f14f6..97c699776 100644
--- a/mapValues.js
+++ b/mapValues.js
@@ -3,7 +3,7 @@ define(['./_baseForOwn', './_baseIteratee'], function(baseForOwn, baseIteratee)
/**
* Creates an object with the same keys as `object` and values generated by
* running each own enumerable property of `object` through `iteratee`. The
- * iteratee function is invoked with three arguments: (value, key, object).
+ * iteratee is invoked with three arguments: (value, key, object).
*
* @static
* @memberOf _
diff --git a/omitBy.js b/omitBy.js
index 9261d5e04..2c72b1f76 100644
--- a/omitBy.js
+++ b/omitBy.js
@@ -1,9 +1,10 @@
define(['./_baseIteratee', './_basePickBy'], function(baseIteratee, basePickBy) {
/**
- * The opposite of `_.pickBy`; this method creates an object composed of the
- * own and inherited enumerable properties of `object` that `predicate`
- * doesn't return truthy for.
+ * The opposite of `_.pickBy`; this method creates an object composed of
+ * the own and inherited enumerable properties of `object` that `predicate`
+ * doesn't return truthy for. The predicate is invoked with two arguments:
+ * (value, key).
*
* @static
* @memberOf _
@@ -19,7 +20,7 @@ define(['./_baseIteratee', './_basePickBy'], function(baseIteratee, basePickBy)
* // => { 'b': '2' }
*/
function omitBy(object, predicate) {
- predicate = baseIteratee(predicate, 2);
+ predicate = baseIteratee(predicate);
return basePickBy(object, function(value, key) {
return !predicate(value, key);
});
diff --git a/package.json b/package.json
index 2dae80f82..9b78992d8 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "lodash-amd",
- "version": "4.5.0",
+ "version": "4.5.1",
"description": "Lodash exported as AMD modules.",
"homepage": "https://lodash.com/custom-builds",
"license": "MIT",
diff --git a/partial.js b/partial.js
index 3c7a3ce33..6c592224a 100644
--- a/partial.js
+++ b/partial.js
@@ -1,4 +1,4 @@
-define(['./_createWrapper', './_replaceHolders', './rest'], function(createWrapper, replaceHolders, rest) {
+define(['./_createWrapper', './_getPlaceholder', './_replaceHolders', './rest'], function(createWrapper, getPlaceholder, replaceHolders, rest) {
/** Used as a safe reference for `undefined` in pre-ES5 environments. */
var undefined;
@@ -39,9 +39,7 @@ define(['./_createWrapper', './_replaceHolders', './rest'], function(createWrapp
* // => 'hi fred'
*/
var partial = rest(function(func, partials) {
- var placeholder = partial.placeholder,
- holders = replaceHolders(partials, placeholder);
-
+ var holders = replaceHolders(partials, getPlaceholder(partial));
return createWrapper(func, PARTIAL_FLAG, undefined, partials, holders);
});
diff --git a/partialRight.js b/partialRight.js
index 0ccf3eee2..bc8169ce9 100644
--- a/partialRight.js
+++ b/partialRight.js
@@ -1,4 +1,4 @@
-define(['./_createWrapper', './_replaceHolders', './rest'], function(createWrapper, replaceHolders, rest) {
+define(['./_createWrapper', './_getPlaceholder', './_replaceHolders', './rest'], function(createWrapper, getPlaceholder, replaceHolders, rest) {
/** Used as a safe reference for `undefined` in pre-ES5 environments. */
var undefined;
@@ -38,9 +38,7 @@ define(['./_createWrapper', './_replaceHolders', './rest'], function(createWrapp
* // => 'hello fred'
*/
var partialRight = rest(function(func, partials) {
- var placeholder = partialRight.placeholder,
- holders = replaceHolders(partials, placeholder);
-
+ var holders = replaceHolders(partials, getPlaceholder(partialRight));
return createWrapper(func, PARTIAL_RIGHT_FLAG, undefined, partials, holders);
});
diff --git a/pickBy.js b/pickBy.js
index d42c043be..65f6c6c0d 100644
--- a/pickBy.js
+++ b/pickBy.js
@@ -18,7 +18,7 @@ define(['./_baseIteratee', './_basePickBy'], function(baseIteratee, basePickBy)
* // => { 'a': 1, 'c': 3 }
*/
function pickBy(object, predicate) {
- return object == null ? {} : basePickBy(object, baseIteratee(predicate, 2));
+ return object == null ? {} : basePickBy(object, baseIteratee(predicate));
}
return pickBy;
diff --git a/pull.js b/pull.js
index 45b6f89a1..764d0327f 100644
--- a/pull.js
+++ b/pull.js
@@ -5,7 +5,8 @@ define(['./pullAll', './rest'], function(pullAll, rest) {
* [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
* for equality comparisons.
*
- * **Note:** Unlike `_.without`, this method mutates `array`.
+ * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
+ * to remove elements from an array by predicate.
*
* @static
* @memberOf _
diff --git a/remove.js b/remove.js
index cc6eebee1..21413ac04 100644
--- a/remove.js
+++ b/remove.js
@@ -2,10 +2,11 @@ define(['./_baseIteratee', './_basePullAt'], function(baseIteratee, basePullAt)
/**
* Removes all elements from `array` that `predicate` returns truthy for
- * and returns an array of the removed elements. The predicate is invoked with
- * three arguments: (value, index, array).
+ * and returns an array of the removed elements. The predicate is invoked
+ * with three arguments: (value, index, array).
*
- * **Note:** Unlike `_.filter`, this method mutates `array`.
+ * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
+ * to pull elements from an array by value.
*
* @static
* @memberOf _
diff --git a/times.js b/times.js
index de69c70af..d5a0368c4 100644
--- a/times.js
+++ b/times.js
@@ -10,8 +10,8 @@ define(['./_baseCastFunction', './_baseTimes', './toInteger'], function(baseCast
var nativeMin = Math.min;
/**
- * Invokes the iteratee function `n` times, returning an array of the results
- * of each invocation. The iteratee is invoked with one argument; (index).
+ * Invokes the iteratee `n` times, returning an array of the results of
+ * each invocation. The iteratee is invoked with one argument; (index).
*
* @static
* @memberOf _
diff --git a/transform.js b/transform.js
index 28e6c506e..a7ff744dc 100644
--- a/transform.js
+++ b/transform.js
@@ -1,7 +1,7 @@
define(['./_arrayEach', './_baseCreate', './_baseForOwn', './_baseIteratee', './isArray', './isFunction', './isObject', './isTypedArray'], function(arrayEach, baseCreate, baseForOwn, baseIteratee, isArray, isFunction, isObject, isTypedArray) {
- /** Used as a safe reference for `undefined` in pre-ES5 environments. */
- var undefined;
+ /** Built-in value references. */
+ var getPrototypeOf = Object.getPrototypeOf;
/**
* An alternative to `_.reduce`; this method transforms `object` to a new
@@ -41,7 +41,7 @@ define(['./_arrayEach', './_baseCreate', './_baseForOwn', './_baseIteratee', './
if (isArr) {
accumulator = isArray(object) ? new Ctor : [];
} else {
- accumulator = baseCreate(isFunction(Ctor) ? Ctor.prototype : undefined);
+ accumulator = isFunction(Ctor) ? baseCreate(getPrototypeOf(object)) : {};
}
} else {
accumulator = {};