第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

【九月打卡】第11天 手寫深拷貝

標簽:
JavaScript

课程名称2周刷完100道前端优质面试真题
课程章节:第8章 前端面试技能拼图6: 编写高质量代码 - 正确,完整,清晰,鲁棒
主讲老师双越
课程内容
今天学习的内容包括:
8-23 手写JS深拷贝-考虑各种数据类型和循环引用

课程收获

JSON.parse(JSON.stringify(o)) 缺陷:

  • 函数、set、map 无法转换
  • 循环引用直接报错
  • 简单结构可用

Object.assign() 只处理最外面一层

考虑 set、map、循环引用的手写深拷贝

思路:
typeof map set obj arr 都是 object。
每一次调用的对象,都存到weakMap里,出现循环引用直接返回即可,避免一直递归。
再对深拷贝对象是 map \ set \ array \ object 四种情况分别处理。
map: new Map, 遍历对于 key value都做递归处理 并 set。
set: new Set,遍历后对 value 递归并依次 add。
array: map 对 value 递归并返回。
object: for in 遍历,并对value 递归后依据 key 赋值。

    const clone = (obj, map = new WeakMap()) => {
      if (typeof obj !== "object" || obj == null) {
        return obj;
      }
      const objFromMap = map.get(obj);
      if (objFromMap) {
        return objFromMap;
      } else {
        let target = {};
        map.set(obj, target);
        if (obj instanceof Map) {
          target = new Map();
          obj.forEach((v, k) => {
            const v1 = clone(v, map);
            const k1 = clone(k, map);
            target.set(k1, v1);
          });
        }
        if (obj instanceof Set) {
          target = new Set();
          obj.forEach((v) => {
            const v1 = clone(v, map);
            target.add(v1);
          });
        }
        if (obj instanceof Array) {
          target = obj.map((item) => clone(item, map));
        }
        for (const key in obj) {
          const val = obj[key];
          const val1 = clone(val, map);
          target[key] = val1;
        }
        return target;
      }
    };
    const a = {
      set: new Set([10, 20, 30]),
      map: new Map([
        ["x", 10],
        ["y", 20],
      ]),
      info: {
        city: "北京",
      },
      fn: () => {
        console.info(100);
      },
    };
    a.self = a;
    console.log("clone", clone(a));

图片描述
以上,结束。

點擊查看更多內(nèi)容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優(yōu)惠券免費領(lǐng)

立即參與 放棄機會
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消