博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Javascript对象拷贝(clone)
阅读量:4709 次
发布时间:2019-06-10

本文共 1898 字,大约阅读时间需要 6 分钟。

1. [代码]方法代码     
function cp(source, target) {


    function isBaseType(v) {

        var type = typeof v;
        var basetype = {

            "string": true,
            "number": true,
            "boolean": true,
            "function": true,
            "undefined": true
        };
        return basetype[type] || v === null;
    }


    function createClone(v) {

        var clone = [];
        if (!(v instanceof Array)) {

            clone = {};
        }
        return clone;
    }


    function createCloneFn(fn) {

        var fncode = fn.toString();
        var regex_params = /^function\s+?(\()([\s\S]*?)(\))/;
        var params = [];
        var params_index = 2;
        var result = fncode.match(regex_params);
        if (result) {

            var param_code = result[params_index];
            if (param_code) {

                params = param_code.split(",")
            }
        } 
        var fncode = fncode.replace(regex_params, "").replace(/^\s*?\{|\}\s*?$/g,"");
        fncode += " console.log('clone')";
        params.push(fncode); 
        return Function.apply(null, params); ;
    }
    function createVal(v)
    {

    var val = v;
    if( typeof v =="function" )
    {
 
    val = createCloneFn(v);
    }
    return val ;
    }
    if (source instanceof Function) {      
target = createCloneFn(source); 
    } else if (source instanceof Array) {

        if (target instanceof Array) {

            var source_size = source.length;
            for (var index = 0; index < source_size; index++) {

                var item = source[index];
                if (!isBaseType(item)) {

                    var clone_array = createClone(item);
                    target.push(clone_array);
                    arguments.callee(item, clone_array);
                }http://www.huiyi8.com/jiaoben/
                //基础类型
                else {jQuery特效
                    target.push( createVal(item));
                }
            }
        } else {

            //console.log("数组拷贝不成立");
        }
    } else if (typeof source == "object") {

        if (!isBaseType(target))
            for (var attrname in source) {

                var val = source[attrname];
                //是否为基础类型
                if (!isBaseType(val)) {

                    var clone_obj = createClone(val);
                    target[attrname] = clone_obj;
                    arguments.callee(val, clone_obj);
                } else {

                    target[attrname] = createVal(val);
                }
            }
    } 
    return target;
}
2. []测试代码     
var target = [];
var source = [
    [{

        a: {

            "show": function() {

                alert(1)
            }
        }
    }]
];
  target =cp(source, target);

转载于:https://www.cnblogs.com/xkzy/p/3830036.html

你可能感兴趣的文章
66. Plus One
查看>>
COMP30023 Computer Systems 2019
查看>>
CSS选择器分类
查看>>
Kali学习笔记39:SQL手工注入(1)
查看>>
C# MD5加密
查看>>
Codeforces Round #329 (Div. 2)D LCA+并查集路径压缩
查看>>
移动应用开发测试工具Bugtags集成和使用教程
查看>>
Java GC、新生代、老年代
查看>>
Liferay 6.2 改造系列之十一:默认关闭CDN动态资源
查看>>
多线程
查看>>
折线切割平面
查看>>
获取当前路径下的所有文件路径 :listFiles
查看>>
图像形态学及更通用的形态学的原理及细节汇总
查看>>
linux开启coredump的3种方法
查看>>
数据驱动之 python + requests + Excel
查看>>
小鸡啄米问题求解
查看>>
Castle.net
查看>>
HDU1532 网络流最大流【EK算法】(模板题)
查看>>
PHP使用curl替代file_get_contents
查看>>
Webstorm通用设置
查看>>