Js深拷贝

2023-05-26 15:22:58 浏览数 (1)

一、消息通道

采用消息通道,即可实现

代码语言:javascript复制
function deepClone(obj) {
    return Promise((resolve) => {
        const { port1, port2 } = new MessageChannel();
        port1.postMessage(obj);
        port2.onmessage = (msg) => {
            resolve(msg.data);
        }
    })
}

二、递归

使用递归

代码语言:javascript复制
function deepClone(obj) {
    const objectMap = new Map();
    const _deepClone = (value) => {
        const _typeof = typeof value;
        const type = Object.prototype.toString.call(value);
      	// 有漏洞,仍需各种判断,如:Date等
        if (_typeof !== 'object' || value === null || type === '[object Date]' || type === '[object RegExp]' || type === '[object Error]') {
            return value;
        }
        if (objectMap.has(value)) {
            return objectMap.get(value);
        }
        const result = Array.isArray(value) ? [] : {};
        objectMap.set(value, result);
        for (const key in value) {
            result[key] = _deepClone(value[key]);
        }
        return result;
    }
    return _deepClone(obj);
}

三、ES6扩展运算符,一维对象则是深拷贝,二维及以上则是浅拷贝。

四、JSON.stringify然后JSON.parse,如果是简单数据数据类型则可,如果value为date、null等,则会出现类型丢失情况,同时相对增加性能损耗问题(Object内的key、value等类型都是在运行时确定的,所以stringify时需要很多工作要做)。

0 人点赞