Make _.clone shallow clone dates, regexps, and boolean/number/string objects. [closes #358]

This commit is contained in:
John-David Dalton
2013-09-26 20:07:07 -07:00
parent 639178dbdc
commit 9749305ecd
6 changed files with 195 additions and 158 deletions

View File

@@ -1027,41 +1027,45 @@
if (!cloneableClasses[className] || (!support.nodeClass && isNode(result))) {
return result;
}
var isArr = isArray(result);
}
// shallow clone
if (!isObj || !deep) {
return isObj
? (isArr ? slice(result) : assign({}, result))
: result;
}
var ctor = ctorByClass[className];
switch (className) {
case boolClass:
case dateClass:
return new ctor(+result);
var ctor = ctorByClass[className],
isArr = isArray(result);
case numberClass:
case stringClass:
return new ctor(result);
switch (className) {
case boolClass:
case dateClass:
return new ctor(+result);
case regexpClass:
return ctor(result.source, reFlags.exec(result));
}
// check for circular references and return corresponding clone
var initedStack = !stackA;
stackA || (stackA = getArray());
stackB || (stackB = getArray());
case numberClass:
case stringClass:
return new ctor(result);
var length = stackA.length;
while (length--) {
if (stackA[length] == value) {
return stackB[length];
case regexpClass:
var lastIndex = result.lastIndex;
result = ctor(result.source, reFlags.exec(result));
result.lastIndex = lastIndex;
return result;
}
} else {
return result;
}
// init cloned object
result = isArr ? ctor(result.length) : {};
if (deep) {
// check for circular references and return corresponding clone
var initedStack = !stackA;
stackA || (stackA = getArray());
stackB || (stackB = getArray());
var length = stackA.length;
while (length--) {
if (stackA[length] == value) {
return stackB[length];
}
}
// init cloned object
result = isArr ? ctor(result.length) : {};
}
else {
result = isArr ? slice(result) : assign({}, result);
}
// add array properties assigned by `RegExp#exec`
if (isArr) {
if (hasOwnProperty.call(value, 'index')) {
@@ -1071,6 +1075,10 @@
result.input = value.input;
}
}
// exit for shallow clone
if (!deep) {
return result;
}
// add the source value to the stack of traversed objects
// and associate it with its clone
stackA.push(value);