ES6新增对象的assign方法

assign:

  ES6拓展的assign是用于复制对象的,和jQuery、undescore中的extend方法类似

  使用方式:Object.assign(obj, obj1, obj2)

    obj: 被复制的目标对象 从第二个参数开始,都是复制的对象 返回值是目标对象obj

    注意:后面对象中的同名属性会覆盖前面对象中的属性

  assign方法实现的是一个浅复制

    •   浅复制:值类型是直接复制,而引用类型是改变指向,没有真正的复制
         
        
           

    •   深复制:值类型是直接复制,引用类型也是直接复制,并不是改变指向(函数除外)
        

  简单实现深复制: JSON.parse(JSON.stringify()),但是转换json字符串的时候,会过滤掉函数

  jQuery 中的 extend 方法第一个参数传递 true 的时候就是深复制,默认不写为false

 

  实现浅复制:

Object.myAssign = function(target) {
        // 遍历arguments
        for (let i = 0; i < arguments.length; i++) {
            // 缓存arguments[i]
            let obj = arguments[i];
            // 使用for in
            for (let key in obj) {
                target[key] = obj[key];
            }
        }
        // 返回target
        return target;
    }
    let result = Object.myAssign(obj, obj1, obj2);
    console.log(result);

  实现深复制:

Object.myAssign = function(target) {
        // 遍历arguments
        for (let i = 0; i < arguments.length; i++) {
            // 缓存arguments[i]
            let obj = arguments[i];
            // 使用for in
            for (let key in obj) {
                // 判断是否是数组
                if (Array.isArray(obj[key])) {
                    // 递归处理
                    target[key] = Object.myAssign([], obj[key])
                } else if (Object.prototype.toString.call(obj[key]) === '[object Object]') {
                    // 判断是否是对象
                    target[key] = Object.myAssign({}, obj[key])
                } else {
                    // 普通处理
                    target[key] = obj[key];
                }
            }
        }
        // 返回target
        return target;
    }
    // 深复制
    let result = Object.myAssign(obj, obj1, obj2);
    obj.name = 'aaa';
    console.log(obj.name === obj1.name);
    // 只是改变指针
    obj.colors.push('pink');
    console.log(obj.colors === obj2.colors);

 

posted @ 2021-04-23 22:56  没有茅台喝啤酒也行  阅读(159)  评论(0编辑  收藏  举报