zoukankan      html  css  js  c++  java
  • Javascript对象拷贝(clone)

    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 = /^functions+?(()([sS]*?)())/;
            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);
                    }
                    //基础类型
                    else {
                        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 {http://www.huiyi8.com/moban/
                        target[attrname] = createVal(val);
                    }
                }
        } 
        return target;
    }
    2. [代码]测试代码     
    var target = [];
    var source = [
        [{
            a: {
                "show": function() {
                    alert(1)
                }
            }
        }]
    ];
      target =cp(source, target);

  • 相关阅读:
    Ubuntu系统Anaconda安装Pytorch,教你如何优雅的安装环境(1-5)
    优雅的装系统------安装MacOS 10.13.5系统教程
    关闭Ubuntu系统更新方法
    毫秒钟搞定anaconda环境使用清华镜像安装OpenCV,教你如何优雅的安装环境(1-4)
    Ubuntu16.04安装Anaconda3并配置国内镜像,教你优雅的安装环境(1-3)
    Anaconda常用命令
    Ubuntu16.04安装CUDA10.2+cuDNN7.6.5(福利区),教你如何优雅的安装环境(1-2)
    Ubuntu16.04安装NVIDIA驱动,教你如何优雅的安装环境(1-1)
    简述 QPS、TPS、并发用户数、吞吐量关系
    Springboot验证注解@vaild的使用
  • 原文地址:https://www.cnblogs.com/xkzy/p/3825858.html
Copyright © 2011-2022 走看看