SOURCE

function isObject (data) {
  return Object.prototype.toString.call(data) === '[object Object]'
}

function clone (obj) {
  const root = {}
  const tmp = [
    {
      parent: root,
      data: obj,
      key: ''
    }
  ]
  let i = 0
  while (i < tmp.length) {
    const source = tmp[i++]
    const { data, parent } = source
    for (let o in data) {
      if (data.hasOwnProperty(o)) {
        parent[o] = data[o]
        if (isObject(data[o])) {
          const _cloned = tmp.find(source => source.data === data[o])
          if (_cloned) parent[o] = _cloned.key ? _cloned.parent[_cloned.key] : _cloned.parent
          else tmp.push({ parent: parent[o], data: data[o], key: o })
        }
      }
    }
  }
  return root
}

const a = { b: { a: { c: 1 } }, d: 8 }
a.a = a
a.b.b = a.b
const b = clone(a)
console.log(b.b.b)
console 命令行工具 X clear

                    
>
console