function deepClone(val) { function getType(_val) { return Object.prototype.toString.call(_val).replace(/[[s]]|(object)/g, '') } const valType = getType(val); if (valType !== 'Object' && valType !== 'Array') return val let output = {} if (valType === 'Array') { output = [] val.forEach(v => { const curValType = getType(v) if (curValType === 'Array' || curValType === 'Object') { output.push(deepClone(v)) } else { output.push(v) } }) } else if (valType === 'Object') { Object.keys(val).forEach(v => { const curValType = getType(v) if (curValType === 'Array' || curValType === 'Object') { output[v]= (deepClone(val[v])) } else { output[v]= (val[v]) } }) } return output}const obj = { a: 1, b: [ { b1: 'b1', b2: { b2_1: 'b2_1' } } ]}const clone = deepClone(obj)obj.b = { b: 'b' }console.log(clone)console.log(obj)