赞
踩
浅拷贝:
创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。 如果属性是基本类型,拷贝的就是基本类型的值。 如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个象。
浅拷贝实现方法:
object.assign()、Array.prototype.slice(),Array.prototype.concat() 、 扩展运算符
深拷贝:
深拷贝开辟一个新的栈,两个对象属完成相同,但是对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性
深拷贝实现方法:
JSON.parse(JSON.stringify()) 、 jQuery.extend()
浅拷贝优点:
相较于重新new一个对象,浅拷贝利用clone()方法要方便快捷许多。 效率高,内存小
浅拷贝缺点:
拷贝的程度低,对于对象的各种引用无法进行拷贝
深拷贝优点:
可靠性高,并且数据在处理的时候不必担心某些不安全问题。
深拷贝缺点:
深拷贝的运行速度较慢,效率低。开辟内存空间拷贝每一个节点身上的数据,浪费性能。 开销相对更大
递归实现深拷贝:
- let deepClone = (target) => {
- let result; // 存储拷贝结果
- let tragetType = checkType(target); // 调用检查类型对函数获取target的类型
-
- // 判断 target 的类型是否为引用类型
- if (tragetType === 'Array') {
- result = [];
- } else if(tragetType === 'Object') {
- result = {};
- } else {
- return target;
- }
-
- // 遍历 target
- for(let key in target) {
- let value = target[key]; // 获取遍历的value
- let valueType = checkType(value); // 检测遍历的value的类型
- if (valueType === 'Array' || valueType === 'Object') {
- result[key] = deepClone(value); // 如果是引用类型,则递归调用,并将结果赋值给result[key]
- } else {
- result[key] = value; // 如果不是引用类型,则直接将 value 赋值 result[key]
- }
- }
- return result; // 返回拷贝结果
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。