1 var Stack = require(
'./_Stack'),
2 arrayEach = require(
'./_arrayEach'),
3 assignValue = require(
'./_assignValue'),
4 baseAssign = require(
'./_baseAssign'),
5 baseAssignIn = require(
'./_baseAssignIn'),
6 cloneBuffer = require(
'./_cloneBuffer'),
7 copyArray = require(
'./_copyArray'),
8 copySymbols = require(
'./_copySymbols'),
9 copySymbolsIn = require(
'./_copySymbolsIn'),
10 getAllKeys = require(
'./_getAllKeys'),
11 getAllKeysIn = require(
'./_getAllKeysIn'),
12 getTag = require(
'./_getTag'),
13 initCloneArray = require(
'./_initCloneArray'),
14 initCloneByTag = require(
'./_initCloneByTag'),
15 initCloneObject = require(
'./_initCloneObject'),
16 isArray = require(
'./isArray'),
17 isBuffer = require(
'./isBuffer'),
18 isObject = require(
'./isObject'),
19 keys = require(
'./keys');
22 var CLONE_DEEP_FLAG = 1,
24 CLONE_SYMBOLS_FLAG = 4;
27 var argsTag =
'[object Arguments]',
28 arrayTag =
'[object Array]',
29 boolTag =
'[object Boolean]',
30 dateTag =
'[object Date]',
31 errorTag =
'[object Error]',
32 funcTag =
'[object Function]',
33 genTag =
'[object GeneratorFunction]',
34 mapTag =
'[object Map]',
35 numberTag =
'[object Number]',
36 objectTag =
'[object Object]',
37 regexpTag =
'[object RegExp]',
38 setTag =
'[object Set]',
39 stringTag =
'[object String]',
40 symbolTag =
'[object Symbol]',
41 weakMapTag =
'[object WeakMap]';
43 var arrayBufferTag =
'[object ArrayBuffer]',
44 dataViewTag =
'[object DataView]',
45 float32Tag =
'[object Float32Array]',
46 float64Tag =
'[object Float64Array]',
47 int8Tag =
'[object Int8Array]',
48 int16Tag =
'[object Int16Array]',
49 int32Tag =
'[object Int32Array]',
50 uint8Tag =
'[object Uint8Array]',
51 uint8ClampedTag =
'[object Uint8ClampedArray]',
52 uint16Tag =
'[object Uint16Array]',
53 uint32Tag =
'[object Uint32Array]';
56 var cloneableTags = {};
57 cloneableTags[argsTag] = cloneableTags[arrayTag] =
58 cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
59 cloneableTags[boolTag] = cloneableTags[dateTag] =
60 cloneableTags[float32Tag] = cloneableTags[float64Tag] =
61 cloneableTags[int8Tag] = cloneableTags[int16Tag] =
62 cloneableTags[int32Tag] = cloneableTags[mapTag] =
63 cloneableTags[numberTag] = cloneableTags[objectTag] =
64 cloneableTags[regexpTag] = cloneableTags[setTag] =
65 cloneableTags[stringTag] = cloneableTags[symbolTag] =
66 cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
67 cloneableTags[uint16Tag] = cloneableTags[uint32Tag] =
true;
68 cloneableTags[errorTag] = cloneableTags[funcTag] =
69 cloneableTags[weakMapTag] =
false;
87 function baseClone(value, bitmask, customizer, key,
object, stack) {
89 isDeep = bitmask & CLONE_DEEP_FLAG,
90 isFlat = bitmask & CLONE_FLAT_FLAG,
91 isFull = bitmask & CLONE_SYMBOLS_FLAG;
94 result =
object ? customizer(value, key,
object, stack) : customizer(value);
96 if (result !== undefined) {
99 if (!isObject(value)) {
102 var isArr = isArray(value);
104 result = initCloneArray(value);
106 return copyArray(value, result);
109 var tag = getTag(value),
110 isFunc = tag == funcTag || tag == genTag;
112 if (isBuffer(value)) {
113 return cloneBuffer(value, isDeep);
115 if (tag == objectTag || tag == argsTag || (isFunc && !
object)) {
116 result = (isFlat || isFunc) ? {} : initCloneObject(value);
119 ? copySymbolsIn(value, baseAssignIn(result, value))
120 : copySymbols(value, baseAssign(result, value));
123 if (!cloneableTags[tag]) {
124 return object ? value : {};
126 result = initCloneByTag(value, tag, baseClone, isDeep);
130 stack || (stack =
new Stack);
131 var stacked = stack.get(value);
135 stack.set(value, result);
137 var keysFunc = isFull
138 ? (isFlat ? getAllKeysIn : getAllKeys)
139 : (isFlat ? keysIn : keys);
141 var props = isArr ? undefined : keysFunc(value);
142 arrayEach(props || value,
function(subValue, key) {
145 subValue = value[key];
148 assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
153 module.exports = baseClone;