浅拷贝、深拷贝

一、浅拷贝

方式1:直接赋值

方式2:Object.assign()

二、深拷贝

方式1:手动实现

function deepClone(source) {
    if(!source) return;

    let target = null;
    switch (true){
        case Array.isArray(source):
            target = [];
            source.forEach((item) => {
                target.push(deepClone(item));
            });
            break;
        case Object.getPrototypeOf(source) === Object.prototype:
            target = {};
            Object.keys(source).forEach((key) => {
                target[key] = deepClone(source[key])
            });
            break;
        default:
            target = source;
    }

    return target
}

方式2:借助JSON

const copy = JSON.parse(JSON.stringify(source));
弊端:会抛弃对象的constructor
适用:能够被json直接表示的数据结构(对象中只包含number、string、boolean、array、扁平对象)
不适用:含有function、regexp的数据结构

方式3:借助第三方工具库

  • loash:_.cloneDeep

  • jquery:$.extend

参考:

Last updated