[JS] 딥 카피 실현

버그
WEB 플랫폼 에 서 는 심 복 사 를 피 하려 고 애 써 JSON. parse (JSON. stringify (Object) 를 사용 해 심 복 사 를 피 해 왔 다.오늘 BUG 를 만 났 다 는 것 을 알 고 JSON 은 function 을 문자열 로 바 꾸 었 습 니 다. 이 BUG 에 줄 을 섰 을 때 초췌 했 습 니 다. Node. js 플랫폼 이 라면 기 존의 바퀴 가 고 르 기 를 기다 리 고 있 었 습 니 다. 안 타 깝 게 도 WEB 는 함부로 들 어 오지 못 하고 손 으로 < > 를 썼 습 니 다.
깊이 복사
/**
 *    
 *     :Boolean,Number,String,null,undefined,Array,Object
 * @param {*} obj 
 */
function deepClone(obj) {

    if (isBaseDataType(obj)) {
        return obj;
    }

    /**
     *       
     *    Symbol  
     * @param {*} obj 
     */
    function judgeType(_obj) {
        return _obj === null ? 'null' : _obj instanceof Array ? 'array' : typeof _obj !== 'object' ? typeof _obj : 'object';
    }

    /**
     *         
     * @param {*} obj 
     */
    function isBaseDataType(_obj) {
        var types = ['boolean', 'number', 'string', 'function', 'null', 'undefined'];
        var type = judgeType(_obj);
        return types.indexOf(type) !== -1;
    }

    /**
     *      
     * @param {*} _obj 
     * @param {*} res 
     */
    function _cloneArry(_obj) {
        var res = [];
        for (var i = 0, len = _obj.length; i < len; i++) {
            var value = _obj[i];
            if (isBaseDataType(value)) {
                res.push(value);
            } else if (judgeType(value) === 'object') {
                res.push(_cloneObj(value));
            } else if (judgeType(value) === 'array') {
                res.push(_cloneArry(value));
            }
        }
        return res;
    }

    /**
     *      
     * @param {*} _obj 
     * @param {*} res 
     */
    function _cloneObj(_obj) {
        var res = {};
        for (var attr in _obj) {
            var value = _obj[attr];
            if (isBaseDataType(value)) {
                res[attr] = value;
            } else if (judgeType(value) === 'object') {
                res[attr] = _cloneObj(value);
            } else if (judgeType(value) === 'array') {
                res[attr] = _cloneArry(value);
            }
        }
        return res;
    }

    if (judgeType(obj) === 'array') {
        return _cloneArry(obj);
    } else {
        return _cloneObj(obj);
    }
}

또한 Object. assgin, 이 인 터 페 이 스 는 정말 깊 은 복사 가 아니 라 크 지도 작 지도 않 은 구덩이 입 니 다.

좋은 웹페이지 즐겨찾기