1 var bufferClone = require('./bufferClone');
3 /** `Object#toString` result references. */
4 var boolTag = '[object Boolean]',
5 dateTag = '[object Date]',
6 numberTag = '[object Number]',
7 regexpTag = '[object RegExp]',
8 stringTag = '[object String]';
10 var arrayBufferTag = '[object ArrayBuffer]',
11 float32Tag = '[object Float32Array]',
12 float64Tag = '[object Float64Array]',
13 int8Tag = '[object Int8Array]',
14 int16Tag = '[object Int16Array]',
15 int32Tag = '[object Int32Array]',
16 uint8Tag = '[object Uint8Array]',
17 uint8ClampedTag = '[object Uint8ClampedArray]',
18 uint16Tag = '[object Uint16Array]',
19 uint32Tag = '[object Uint32Array]';
21 /** Used to match `RegExp` flags from their coerced string values. */
25 * Initializes an object clone based on its `toStringTag`.
27 * **Note:** This function only supports cloning values with tags of
28 * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
31 * @param {Object} object The object to clone.
32 * @param {string} tag The `toStringTag` of the object to clone.
33 * @param {boolean} [isDeep] Specify a deep clone.
34 * @returns {Object} Returns the initialized clone.
36 function initCloneByTag(object, tag, isDeep) {
37 var Ctor = object.constructor;
40 return bufferClone(object);
44 return new Ctor(+object);
46 case float32Tag: case float64Tag:
47 case int8Tag: case int16Tag: case int32Tag:
48 case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
49 var buffer = object.buffer;
50 return new Ctor(isDeep ? bufferClone(buffer) : buffer, object.byteOffset, object.length);
54 return new Ctor(object);
57 var result = new Ctor(object.source, reFlags.exec(object));
58 result.lastIndex = object.lastIndex;
63 module.exports = initCloneByTag;