zoukankan      html  css  js  c++  java
  • 使用MessageChannel(消息通道)进行深拷贝

    深拷贝一般用JSON.parse(JSON.stringify(object))就可以解决了,

    也知道这种方法的局限性:

    • 会忽略 undefined
    • 不能序列化函数
    • 不能解决循环引用的对象

    因为MessageChannelpostMessage传递的数据也是深拷贝的,这和web workerpostMessage一样。而且还可以拷贝undefined和循环引用的对象。

    示例如下

    // 有undefined + 循环引用
        let obj = {
          a: 1,
          b: {
            c: 2,
            d: 3,
          },
          f: undefined
        }
        obj.c = obj.b;
        obj.e = obj.a
        obj.b.c = obj.c
        obj.b.d = obj.b
        obj.b.e = obj.b.c
    
        function deepCopy(obj) {
          return new Promise((resolve) => {
            const {port1, port2} = new MessageChannel();
            port2.onmessage = ev => resolve(ev.data);
            port1.postMessage(obj);
          });
        }
    
        deepCopy(obj).then((copy) => {           // 请记住`MessageChannel`是异步的这个前提!
            let copyObj = copy;
            console.log(copyObj, obj)
            console.log(copyObj == obj)
        });

    只是拷贝函数还是有问题,会报错。

    原文来源于

    MessageChannel是什么,怎么使用?

  • 相关阅读:
    P1006 传纸条
    P1387 最大正方形
    P1417 烹调方案
    P1052 过河
    P1063 能量项链
    P1736 创意吃鱼法
    P1156 垃圾陷阱
    P1220 关路灯
    @P1373 小a和uim之大逃离
    【leetcode】Interleaving String
  • 原文地址:https://www.cnblogs.com/LeoXnote/p/14294382.html
Copyright © 2011-2022 走看看