react / wstein / node_modules / jest-cli / node_modules / istanbul / node_modules / js-yaml / node_modules / argparse / node_modules / lodash / internal / baseClone.js
80742 viewsvar arrayCopy = require('./arrayCopy'),1arrayEach = require('./arrayEach'),2baseAssign = require('./baseAssign'),3baseForOwn = require('./baseForOwn'),4initCloneArray = require('./initCloneArray'),5initCloneByTag = require('./initCloneByTag'),6initCloneObject = require('./initCloneObject'),7isArray = require('../lang/isArray'),8isObject = require('../lang/isObject');910/** `Object#toString` result references. */11var argsTag = '[object Arguments]',12arrayTag = '[object Array]',13boolTag = '[object Boolean]',14dateTag = '[object Date]',15errorTag = '[object Error]',16funcTag = '[object Function]',17mapTag = '[object Map]',18numberTag = '[object Number]',19objectTag = '[object Object]',20regexpTag = '[object RegExp]',21setTag = '[object Set]',22stringTag = '[object String]',23weakMapTag = '[object WeakMap]';2425var arrayBufferTag = '[object ArrayBuffer]',26float32Tag = '[object Float32Array]',27float64Tag = '[object Float64Array]',28int8Tag = '[object Int8Array]',29int16Tag = '[object Int16Array]',30int32Tag = '[object Int32Array]',31uint8Tag = '[object Uint8Array]',32uint8ClampedTag = '[object Uint8ClampedArray]',33uint16Tag = '[object Uint16Array]',34uint32Tag = '[object Uint32Array]';3536/** Used to identify `toStringTag` values supported by `_.clone`. */37var cloneableTags = {};38cloneableTags[argsTag] = cloneableTags[arrayTag] =39cloneableTags[arrayBufferTag] = cloneableTags[boolTag] =40cloneableTags[dateTag] = cloneableTags[float32Tag] =41cloneableTags[float64Tag] = cloneableTags[int8Tag] =42cloneableTags[int16Tag] = cloneableTags[int32Tag] =43cloneableTags[numberTag] = cloneableTags[objectTag] =44cloneableTags[regexpTag] = cloneableTags[stringTag] =45cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =46cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;47cloneableTags[errorTag] = cloneableTags[funcTag] =48cloneableTags[mapTag] = cloneableTags[setTag] =49cloneableTags[weakMapTag] = false;5051/** Used for native method references. */52var objectProto = Object.prototype;5354/**55* Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)56* of values.57*/58var objToString = objectProto.toString;5960/**61* The base implementation of `_.clone` without support for argument juggling62* and `this` binding `customizer` functions.63*64* @private65* @param {*} value The value to clone.66* @param {boolean} [isDeep] Specify a deep clone.67* @param {Function} [customizer] The function to customize cloning values.68* @param {string} [key] The key of `value`.69* @param {Object} [object] The object `value` belongs to.70* @param {Array} [stackA=[]] Tracks traversed source objects.71* @param {Array} [stackB=[]] Associates clones with source counterparts.72* @returns {*} Returns the cloned value.73*/74function baseClone(value, isDeep, customizer, key, object, stackA, stackB) {75var result;76if (customizer) {77result = object ? customizer(value, key, object) : customizer(value);78}79if (result !== undefined) {80return result;81}82if (!isObject(value)) {83return value;84}85var isArr = isArray(value);86if (isArr) {87result = initCloneArray(value);88if (!isDeep) {89return arrayCopy(value, result);90}91} else {92var tag = objToString.call(value),93isFunc = tag == funcTag;9495if (tag == objectTag || tag == argsTag || (isFunc && !object)) {96result = initCloneObject(isFunc ? {} : value);97if (!isDeep) {98return baseAssign(result, value);99}100} else {101return cloneableTags[tag]102? initCloneByTag(value, tag, isDeep)103: (object ? value : {});104}105}106// Check for circular references and return corresponding clone.107stackA || (stackA = []);108stackB || (stackB = []);109110var length = stackA.length;111while (length--) {112if (stackA[length] == value) {113return stackB[length];114}115}116// Add the source value to the stack of traversed objects and associate it with its clone.117stackA.push(value);118stackB.push(result);119120// Recursively populate clone (susceptible to call stack limits).121(isArr ? arrayEach : baseForOwn)(value, function(subValue, key) {122result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB);123});124return result;125}126127module.exports = baseClone;128129130