js对象深拷贝

时间:2022-12-05 19:53:27
/**
*对象深拷贝2018-3-2
*使用方法deepAssign(obj1,obj2...)
**/        
		
		
		
		//测试
		//var china = {
        //    nation : '中国',
        //    birthplaces:['北京','上海','广州'],
        //    skincolr :{aa:111,bb:{qq:{hahha:{kkkk:"哈哈哈"}}}},
        //    friends:['sk','ls']
       // }
       // var result = {name:'result', skincolr :{aa:111,bb:{qq:{hahha:{kkkk:"可以啦啦啦啦"}}}}}

        //深复制,要想达到深复制就需要用递归
        function isObj(x){
            var type = typeof x;
            return x !== null && (type === 'object' || type === 'function');
        }

        var hasOwnProperty = Object.prototype.hasOwnProperty;
        var propIsEnumerable = Object.prototype.propertyIsEnumerable;

        function toObject(val) {
            if (val === null || val === undefined) {
                throw new TypeError('Cannot convert undefined or null to object');
            }

            return Object(val);
        }

        function assignKey(to, from, key) {
            var val = from[key];

            if (val === undefined || val === null) {
                return;
            }

            if (hasOwnProperty.call(to, key)) {
                if (to[key] === undefined || to[key] === null) {
                    throw new TypeError('Cannot convert undefined or null to object (' + key + ')');
                }
            }

            if (!hasOwnProperty.call(to, key) || !isObj(val)) {
                to[key] = val;
            } else {
                to[key] = assign(Object(to[key]), from[key]);
            }
        }

        function assign(to, from) {
            if (to === from) {
                return to;
            }

            from = Object(from);

            for (var key in from) {
                if (hasOwnProperty.call(from, key)) {
                    assignKey(to, from, key);
                }
            }

            if (Object.getOwnPropertySymbols) {
                var symbols = Object.getOwnPropertySymbols(from);

                for (var i = 0; i < symbols.length; i++) {
                    if (propIsEnumerable.call(from, symbols[i])) {
                        assignKey(to, from, symbols[i]);
                    }
                }
            }

            return to;
        }

        function deepAssign(target) {
            target = toObject(target);

            for (var s = 1; s < arguments.length; s++) {
                assign(target, arguments[s]);
            }

            return target;
        };
       // deepAssign(china,result)
		//console.log(china)