首页 > 其他分享 >js深拷贝面试题

js深拷贝面试题

时间:2023-02-12 15:58:46浏览次数:34  
标签:面试题 cacheMap temp js cloneDeep key obj 拷贝 const

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>深拷贝</title>
</head>

<body>
  <script>
    const obj1 = {
      array: [1, 2],
      arrayOfObj: [{ a: 3 }, { b: 4 }],
      obj: { c: 5 },
      reg: /7/,
      data: new Date(),
      map: new Map([['d', 8], ['e', 9]]),
      set: new Set([10, 11]),
      num: 12,
      str: 'xxx',
      bol: false,
      fn: function () { console.log(13) },
      nulVal: null,
      undVal: undefined
    }

    function cloneDeep (obj = {}, cacheMap = new WeakMap()) {

      if (typeof obj !== "object" || !obj) {
        return obj
      }

      if (cacheMap.has(obj)) {
        return cacheMap.get(obj)
      }

      let temp, params;
      const constructor = obj.constructor;

      if (obj instanceof RegExp || obj instanceof Date) {
        params = obj
      }

      temp = new constructor(params)
      cacheMap.set(obj, temp)

      if (obj instanceof Map) {
        for (const [key, value] of obj) {
          temp.set(cloneDeep(key, cacheMap), cloneDeep(value, cacheMap))
        }
      } else if (obj instanceof Set) {
        for (const value of obj) {
          temp.add(cloneDeep(value, cacheMap))
        }
      } else {
        for (let key in obj) {
          if (obj.hasOwnProperty(key)) {
            temp[key] = cloneDeep(obj[key], cacheMap)
          }
        }
      }
      return temp;
    }

    const obj2 = {
      to: obj1
    }
    obj1.to = obj2

    const result = cloneDeep(obj1)
    console.log(obj1, result);
  </script>
</body>

</html>

标签:面试题,cacheMap,temp,js,cloneDeep,key,obj,拷贝,const
From: https://www.cnblogs.com/iooz/p/17113909.html

相关文章

  • JSTL_常用标签_foreach与JSTL_练习
    JSTL_常用标签_foreachforeach:相当于Java代码的for1.完成重复的操作for(inti=0;i<10;i++){}属性:b......
  • 778~779 JSTL常用标签 choose,foreach
    2.choose:相当于java代码的switch语句1.使用choose标签声明                 相当于switch声明2.使用when标签做判断  ......
  • 奇怪的面试题
    变量的面试题vara=1;console.log(a);if(true){a=2;functiona(){}a=3console.log(a);}console.log(a);//132promise的面试题Promise.......
  • 2023最全Java面试题及答案整理汇总
    前言面试前还是很有必要针对性的刷一些题,很多朋友的实战能力很强,但是理论比较薄弱,面试前不做准备是很吃亏的。这里整理了很多面试常考的一些面试题,希望能帮助到你面试前的......
  • 776~777 JSTL概述,常用标签
    JSTL1.概念:JavaServerPagesTagLibrary JSP标准标签库是由Apache组织提供的开源的免费的jsp标签      <标签>2.作用:用于简化和替换jsp页......
  • JSON语法值的获取
    JSON-语法-值的获取获取数据:1.json对象.键名2.json对象["键名"]3.数组对象[索引]4.遍历JSON值的获取<!DOCTYPEhtml><htmllang="en"......
  • JSON概述与JSON语法定义
    JSON的概念概念:JavaScript Object Notation JacaScript对象表示法json现在多用于存储和交换文本信息的语法进行数据的传输JSON比XML更小更快,更易解析 ......
  • 如何解决一个偶现的bug,附一个解决threejs模型贴图呈现白色bug流程
    如何解决一个偶现的bug    首先引用公司测试的一句话:所有偶现的bug必定有一个必现的途径。   因此解决偶现bug两种方案:   1.让bug的出现概率变大。 ......
  • 拷贝构造函数
    拷贝构造函数用一个已存在的对象创建新的对象,不会调用(普通)构造函数,而是调用拷贝构造函数。如果类中没有定义拷贝构造函数,编译器将提供一个拷贝构造函数,它的功能是把已存......
  • Gson_Java对象转为json对象
    在对客户端进行相应的时候,要把一个JavaBean对象发送给浏览器,最好是转为json对象。   一、导入jar包  二、使用例子:把一个集合对象以json的格式响应给......