// 递归function dfsCloneDeep(source, hash = new WeakMap()) {    if (!typeof sorce === 'object') return source; // 非对象返回自身    if (hash.has(source)) return hash.get(source); // 查哈希表,如果以拷贝,则直接返回值,解决循环引用    let target = Array.isArray(source) ? [] : {}; // 区分数组和对象    hash.set(source, target); // 哈希表设值,哈希表存储已拷贝过的对象    let symKeys = Object.getOwnPropertySymbols(source); // 解决拷贝symbol    if (symKeys.length) {        symKeys.forEach(symKey => {            if (typeof source[symKey] === 'object' && source[symKey] !== null) {                target[symKey] = dfsCloneDeep(source[symKey], hash);             } else {                target[symKey] = source[symKey];            }            });    }    for(let key in source) {        if (Object.prototype.hasOwnProperty.call(source, key)) {            if (typeof source[key] === 'object' && source[key] !== null) {                target[key] = dfsCloneDeep(source[key], hash); // 注意这里传入hash            } else {                target[key] = source[key];            }        }    }    return target;}// 队列 function bfsCloneDeep(obj) {   let root = Array.isArray(obj) ? [] : {};   let nodeList = [{       parent: root,       key: undefined,       data: obj,   }];   while (nodeList.length) {     let node = nodeList.pop(),         parent = node.parent,         key = node.key,         data = node.data;     let result = parent;     if (typeof key !== 'undefined') { // 初始化赋值目标,key为undefined则拷贝到父元素,否则拷贝到子元素        result = parent[key] = Array.isArray(data) ? [] : {};     }     let symKeys = Object.getOwnPropertySymbols(data); // 解决拷贝symbol     if (symKeys.length) {          symKeys.forEach(symKey => {            if (typeof data[symKey] === 'object' && data[symKey] !== null) {                nodeList.push({                   parent: result,                   key: symKeys,                   data: data[symKey],                });            } else {              result[symKey] = data[symKey];            }         });      }      for (let key in data) {          if (data.hasOwnProperty(key)) {             if (typeof data[key] === 'object') {                 nodeList.push({                    parent: result,                    key,                    data: data[key],                 });             } else {                 result[key] = data[key];             }          }       }    }    return root;};let obj = {colors: ['blue', 'red'],width: 200, height: 300};let l = Symbol('length');obj[l] = 400 ;let obj1 = bfsCloneDeep(obj)// {colors: ['blue', 'red'], width: 200, height: 300, Symbol(length): 400}let obj2 = dfsCloneDeep(obj)// {colors: ['blue', 'red'], width: 200, height: 300, Symbol(length): 400}