Add internal isObjectLike.

This commit is contained in:
John-David Dalton
2014-12-06 13:12:03 -08:00
parent fdbec5b0d2
commit dbcfe3f5d2

View File

@@ -726,6 +726,17 @@
return value > -1 && value % 1 == 0 && (length == null || value < length); return value > -1 && value % 1 == 0 && (length == null || value < length);
} }
/**
* Checks if `value` is object-like.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
*/
function isObjectLike(value) {
return (value && typeof value == 'object') || false;
}
/** /**
* Used by `trimmedLeftIndex` and `trimmedRightIndex` to determine if a * Used by `trimmedLeftIndex` and `trimmedRightIndex` to determine if a
* character code is whitespace. * character code is whitespace.
@@ -1066,7 +1077,7 @@
* // => true * // => true
*/ */
function lodash(value) { function lodash(value) {
if (value && typeof value == 'object' && !isArray(value)) { if (isObjectLike(value) && !isArray(value)) {
if (value instanceof LodashWrapper) { if (value instanceof LodashWrapper) {
return value; return value;
} }
@@ -2032,8 +2043,7 @@
while (++index < length) { while (++index < length) {
var value = array[index]; var value = array[index];
if (value && typeof value == 'object' && typeof value.length == 'number' if (isObjectLike(value) && isLength(value.length) && (isArray(value) || isArguments(value))) {
&& (isArray(value) || isArguments(value))) {
// Recursively flatten arrays (susceptible to call stack limits). // Recursively flatten arrays (susceptible to call stack limits).
if (isDeep) { if (isDeep) {
value = baseFlatten(value, isDeep, isStrict); value = baseFlatten(value, isDeep, isStrict);
@@ -3343,7 +3353,7 @@
* @returns {boolean} Returns `true` if `value` is an array-like object, else `false`. * @returns {boolean} Returns `true` if `value` is an array-like object, else `false`.
*/ */
function isArrayLike(value) { function isArrayLike(value) {
return (value && typeof value == 'object' && isLength(value.length) && return (isObjectLike(value) && isLength(value.length) &&
(arrayLikeClasses[toString.call(value)] || (!lodash.support.argsClass && isArguments(value)))) || false; (arrayLikeClasses[toString.call(value)] || (!lodash.support.argsClass && isArguments(value)))) || false;
} }
@@ -3571,8 +3581,7 @@
support = lodash.support; support = lodash.support;
// Exit early for non `Object` objects. // Exit early for non `Object` objects.
if (!(value && typeof value == 'object' && if (!(isObjectLike(value) && toString.call(value) == objectClass && !isHostObject(value)) ||
toString.call(value) == objectClass && !isHostObject(value)) ||
(!hasOwnProperty.call(value, 'constructor') && (!hasOwnProperty.call(value, 'constructor') &&
(Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor))) || (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor))) ||
(!support.argsClass && isArguments(value))) { (!support.argsClass && isArguments(value))) {
@@ -7343,13 +7352,13 @@
* // => false * // => false
*/ */
function isArguments(value) { function isArguments(value) {
var length = (value && typeof value == 'object') ? value.length : undefined; var length = isObjectLike(value) ? value.length : undefined;
return (isLength(length) && toString.call(value) == argsClass) || false; return (isLength(length) && toString.call(value) == argsClass) || false;
} }
// Fallback for environments without a `[[Class]]` for `arguments` objects. // Fallback for environments without a `[[Class]]` for `arguments` objects.
if (!support.argsClass) { if (!support.argsClass) {
isArguments = function(value) { isArguments = function(value) {
var length = (value && typeof value == 'object') ? value.length : undefined; var length = isObjectLike(value) ? value.length : undefined;
return (isLength(length) && hasOwnProperty.call(value, 'callee') && return (isLength(length) && hasOwnProperty.call(value, 'callee') &&
!propertyIsEnumerable.call(value, 'callee')) || false; !propertyIsEnumerable.call(value, 'callee')) || false;
}; };
@@ -7372,8 +7381,7 @@
* // => false * // => false
*/ */
var isArray = nativeIsArray || function(value) { var isArray = nativeIsArray || function(value) {
return (value && typeof value == 'object' && typeof value.length == 'number' && return (isObjectLike(value) && isLength(value.length) && toString.call(value) == arrayClass) || false;
toString.call(value) == arrayClass) || false;
}; };
/** /**
@@ -7393,8 +7401,7 @@
* // => false * // => false
*/ */
function isBoolean(value) { function isBoolean(value) {
return (value === true || value === false || value && typeof value == 'object' && return (value === true || value === false || isObjectLike(value) && toString.call(value) == boolClass) || false;
toString.call(value) == boolClass) || false;
} }
/** /**
@@ -7414,7 +7421,7 @@
* // => false * // => false
*/ */
function isDate(value) { function isDate(value) {
return (value && typeof value == 'object' && toString.call(value) == dateClass) || false; return (isObjectLike(value) && toString.call(value) == dateClass) || false;
} }
/** /**
@@ -7434,13 +7441,13 @@
* // => false * // => false
*/ */
function isElement(value) { function isElement(value) {
return (value && typeof value == 'object' && value.nodeType === 1 && return (value && value.nodeType === 1 && isObjectLike(value) &&
(lodash.support.nodeClass ? toString.call(value).indexOf('Element') > -1 : isHostObject(value))) || false; (lodash.support.nodeClass ? toString.call(value).indexOf('Element') > -1 : isHostObject(value))) || false;
} }
// Fallback for environments without DOM support. // Fallback for environments without DOM support.
if (!support.dom) { if (!support.dom) {
isElement = function(value) { isElement = function(value) {
return (value && typeof value == 'object' && value.nodeType === 1 && !isPlainObject(value)) || false; return (value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value)) || false;
}; };
} }
@@ -7477,7 +7484,7 @@
} }
var length = value.length; var length = value.length;
if (isLength(length) && (isArray(value) || isString(value) || isArguments(value) || if (isLength(length) && (isArray(value) || isString(value) || isArguments(value) ||
(typeof value == 'object' && isFunction(value.splice)))) { (isObjectLike(value) && isFunction(value.splice)))) {
return !length; return !length;
} }
return !keys(value).length; return !keys(value).length;
@@ -7547,7 +7554,7 @@
* // => false * // => false
*/ */
function isError(value) { function isError(value) {
return (value && typeof value == 'object' && toString.call(value) == errorClass) || false; return (isObjectLike(value) && toString.call(value) == errorClass) || false;
} }
/** /**
@@ -7699,7 +7706,7 @@
if (toString.call(value) == funcClass) { if (toString.call(value) == funcClass) {
return reNative.test(fnToString.call(value)); return reNative.test(fnToString.call(value));
} }
return (typeof value == 'object' && return (isObjectLike(value) &&
(isHostObject(value) ? reNative : reHostCtor).test(value)) || false; (isHostObject(value) ? reNative : reHostCtor).test(value)) || false;
} }
@@ -7746,8 +7753,7 @@
* // => false * // => false
*/ */
function isNumber(value) { function isNumber(value) {
var type = typeof value; return typeof value == 'number' || (isObjectLike(value) && toString.call(value) == numberClass) || false;
return type == 'number' || (value && type == 'object' && toString.call(value) == numberClass) || false;
} }
/** /**
@@ -7830,8 +7836,7 @@
* // => false * // => false
*/ */
function isString(value) { function isString(value) {
return typeof value == 'string' || (value && typeof value == 'object' && return typeof value == 'string' || (isObjectLike(value) && toString.call(value) == stringClass) || false;
toString.call(value) == stringClass) || false;
} }
/** /**