当前位置:   article > 正文

深拷贝与浅拷贝的区别、实现浅、深拷贝的方法分别有哪些?优缺点是什么_浅谈深拷贝浅拷贝写法的优点

浅谈深拷贝浅拷贝写法的优点

浅拷贝:
创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。 如果属性是基本类型,拷贝的就是基本类型的值。 如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个象。

 

浅拷贝实现方法:
object.assign()、Array.prototype.slice(),Array.prototype.concat() 、 扩展运算符

深拷贝:
深拷贝开辟一个新的栈,两个对象属完成相同,但是对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性

 

深拷贝实现方法:
JSON.parse(JSON.stringify()) 、 jQuery.extend()

浅拷贝优点:
相较于重新new一个对象,浅拷贝利用clone()方法要方便快捷许多。 效率高,内存小
浅拷贝缺点:
拷贝的程度低,对于对象的各种引用无法进行拷贝

深拷贝优点:
可靠性高,并且数据在处理的时候不必担心某些不安全问题。
深拷贝缺点:
深拷贝的运行速度较慢,效率低。开辟内存空间拷贝每一个节点身上的数据,浪费性能。 开销相对更大

递归实现深拷贝:
 

  1. let deepClone = (target) => {
  2. let result; // 存储拷贝结果
  3. let tragetType = checkType(target); // 调用检查类型对函数获取target的类型
  4. // 判断 target 的类型是否为引用类型
  5. if (tragetType === 'Array') {
  6. result = [];
  7. } else if(tragetType === 'Object') {
  8. result = {};
  9. } else {
  10. return target;
  11. }
  12. // 遍历 target
  13. for(let key in target) {
  14. let value = target[key]; // 获取遍历的value
  15. let valueType = checkType(value); // 检测遍历的value的类型
  16. if (valueType === 'Array' || valueType === 'Object') {
  17. result[key] = deepClone(value); // 如果是引用类型,则递归调用,并将结果赋值给result[key]
  18. } else {
  19. result[key] = value; // 如果不是引用类型,则直接将 value 赋值 result[key]
  20. }
  21. }
  22. return result; // 返回拷贝结果
  23. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/318563?site
推荐阅读
相关标签
  

闽ICP备14008679号