js克隆小结

克隆分为浅克隆和深度克隆:

对于原始值而言,直接复制是对值的复制。而对引用值的拷贝是地址的拷贝,这与他们的数据结构有关。

原始值直接存放在栈内存中(房间里有的东西),而且对于引用值,栈内存中存的是地址(内部数据的地址,相当于门的钥匙)

当我们引用值拷贝的时候,就是多配了一把钥匙给另外一个变量。(两个变量都可以改变房间里的数据)

上面说到,浅拷贝只能拷贝引用值的地址,这不是我们想要的。我们需要的是两份数据是相互独立的,

所以深度克隆实现的目的是创建一个新的房间,把想要的数据拷贝进来,而不是拷贝他的地址。

深度克隆实现:

第一步:数据的判断。是否是原型链上的,是否是引用值,是否是原始值,

第二步:筛选掉原型上的数据,引用值使用递归继续拷贝,原始值复制给新对象。

function deepclone(origin, target) {
            var target = target || {},
                toSter = Object.prototype.toString,
                arrstr = '[object Array]';
            for (var prop in origin) {
                if (origin.hasOwnProperty(prop)) {
                    if (origin[prop] !== null && typeof (origin[prop]) === 'object') {
                        target[prop] = toSter.call(origin[prop]) === arrstr ? [] : {};
                        deepclone(origin[prop],target[prop]);
                    } else {
                        target[prop] = origin[prop];
                    }
                }
            }
        }

以上代码简单实现对引用值中对象和数组的拷贝,对包装类没有实现。

猜你喜欢

转载自blog.csdn.net/qq_35401191/article/details/82462980
今日推荐