UNPKG

2.45 kBJavaScriptView Raw
1var cloneArrayBuffer = require('./_cloneArrayBuffer'),
2 cloneDataView = require('./_cloneDataView'),
3 cloneMap = require('./_cloneMap'),
4 cloneRegExp = require('./_cloneRegExp'),
5 cloneSet = require('./_cloneSet'),
6 cloneSymbol = require('./_cloneSymbol'),
7 cloneTypedArray = require('./_cloneTypedArray');
8
9/** `Object#toString` result references. */
10var boolTag = '[object Boolean]',
11 dateTag = '[object Date]',
12 mapTag = '[object Map]',
13 numberTag = '[object Number]',
14 regexpTag = '[object RegExp]',
15 setTag = '[object Set]',
16 stringTag = '[object String]',
17 symbolTag = '[object Symbol]';
18
19var arrayBufferTag = '[object ArrayBuffer]',
20 dataViewTag = '[object DataView]',
21 float32Tag = '[object Float32Array]',
22 float64Tag = '[object Float64Array]',
23 int8Tag = '[object Int8Array]',
24 int16Tag = '[object Int16Array]',
25 int32Tag = '[object Int32Array]',
26 uint8Tag = '[object Uint8Array]',
27 uint8ClampedTag = '[object Uint8ClampedArray]',
28 uint16Tag = '[object Uint16Array]',
29 uint32Tag = '[object Uint32Array]';
30
31/**
32 * Initializes an object clone based on its `toStringTag`.
33 *
34 * **Note:** This function only supports cloning values with tags of
35 * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
36 *
37 * @private
38 * @param {Object} object The object to clone.
39 * @param {string} tag The `toStringTag` of the object to clone.
40 * @param {Function} cloneFunc The function to clone values.
41 * @param {boolean} [isDeep] Specify a deep clone.
42 * @returns {Object} Returns the initialized clone.
43 */
44function initCloneByTag(object, tag, cloneFunc, isDeep) {
45 var Ctor = object.constructor;
46 switch (tag) {
47 case arrayBufferTag:
48 return cloneArrayBuffer(object);
49
50 case boolTag:
51 case dateTag:
52 return new Ctor(+object);
53
54 case dataViewTag:
55 return cloneDataView(object, isDeep);
56
57 case float32Tag: case float64Tag:
58 case int8Tag: case int16Tag: case int32Tag:
59 case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
60 return cloneTypedArray(object, isDeep);
61
62 case mapTag:
63 return cloneMap(object, isDeep, cloneFunc);
64
65 case numberTag:
66 case stringTag:
67 return new Ctor(object);
68
69 case regexpTag:
70 return cloneRegExp(object);
71
72 case setTag:
73 return cloneSet(object, isDeep, cloneFunc);
74
75 case symbolTag:
76 return cloneSymbol(object);
77 }
78}
79
80module.exports = initCloneByTag;