美文网首页
深拷贝与浅拷贝的区别?如何实现一个深拷贝?

深拷贝与浅拷贝的区别?如何实现一个深拷贝?

作者: 忆当年L | 来源:发表于2019-03-12 10:21 被阅读0次

深拷贝与浅拷贝的区别?如何实现一个深拷贝

在回答这个问题前,我们先来回顾一下JS中两大数据类型

基本类型 Undefined、Null、Boolean、Number、String

引用类型 Object Array

基本类型

基本类型就是值类型, 存放在栈(stack)内存中的简单数据段,数据大小确定,内存空间大小可以分配

引用类型

引用类型, 存放在堆(heap)内存中的对象,变量实际保存的是一个指针,这个指针指向另一个位置

根据上面的分析,我们分别是两处类型做一个copy处理

let obj = {

    name: '忆当年',

    value: 'JS'

}

let obj2 = obj

let obj3 = obj.name

console.log(obj2.value) //JS

console.log(obj3) // 忆当年

// 改变obj2,obj3

obj2.value = 'CSS'

obj3 = 'HTML'

console.log(obj.value) // CSS

console.log(obj.name) // 忆当年

从上面的输出结束来看,我们可以猜测obj,obj2操作的是同一个对象,而obj和obj3是完全独立的, 说到这里就进入了深浅拷贝

浅拷贝

概念: 对于字符串类型,浅拷贝是对值的复制,对于对象来说,浅拷贝是对对象地址的复制, 也就是拷贝的结果是两个对象指向同一个地址

深拷贝

概念: 深拷贝开辟一个新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性

如何实现深拷贝

JSON.stringify()

* 缺点: JSON.stringify()无法正确处理函数

let obj = {

    name: '忆当年',

    value: 'JS'

}

console.log(JSON.parse(JSON.stringify(obj))) // 深拷贝了一份obj

let obj = {

    name: '忆当年',

    value: 'JS',

    fn: function(){}

}

console.log(JSON.parse(JSON.stringify(obj))) // obj.fn 丢失

递归

讲到深copy很多人都会想到extend方法,没错,这玩意deep为true确实能深copy,我们就过来翻一翻他的源码

这边以大家熟悉的jquery为例

// 整体思路就是递归对象,判断类型,处理类型

    for ( ; i < length; i++ ) {

        // Only deal with non-null/undefined values

        if ( ( options = arguments[ i ] ) != null ) {

            // Extend the base object

            for ( name in options ) {

                copy = options[ name ];

                // Prevent never-ending loop

                if ( target === copy ) {

                    continue;

                }

                // Recurse if we're merging plain objects or arrays

                if ( deep && copy && ( jQuery.isPlainObject( copy ) ||

                    ( copyIsArray = Array.isArray( copy ) ) ) ) {

                    src = target[ name ];

                    // Ensure proper type for the source value

                    if ( copyIsArray && !Array.isArray( src ) ) {

                        clone = [];

                    } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {

                        clone = {};

                    } else {

                        clone = src;

                    }

                    copyIsArray = false;

                    // Never move original objects, clone them

                    target[ name ] = jQuery.extend( deep, clone, copy );

                // Don't bring in undefined values

                } else if ( copy !== undefined ) {

                    target[ name ] = copy;

                }

            }

        }

    }

总结

浅拷贝是复制,两个对象指向同一个地址

深拷贝是新开栈,两个对象指向不同的地址

相关文章

  • 深拷贝、浅拷贝

    父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 深拷贝同浅拷贝的区别:浅拷贝...

  • 面试题整理

    父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 深拷贝同浅拷贝的区别:浅拷贝...

  • 面试 (一) : 基础篇

    父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。• 深拷贝同浅拷贝的区别:浅拷...

  • 基础

    1、父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 深拷贝同浅拷贝的区别:浅...

  • 常见的面试(一)

    父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。• 深拷贝同浅拷贝的区别:浅拷...

  • iOS基础知识点(网络摘抄)

    1.父类实现深拷贝时,子类如何实现深拷贝。父类没有实现深拷贝时,子类如何实现深拷贝? 深拷贝同浅拷贝的区别:...

  • 五、面试总结(五)

    对象 拷贝(clone) 如何实现对象克隆 深拷贝和浅拷贝区别 深拷贝和浅拷贝如何实现激活机制 写clone()方...

  • iOS知识点(一)

    1.1 父类实现深拷贝时,子类如何实现深度拷贝。 父类没有实现深拷贝时,子类如何实现深度拷贝。深拷贝同浅拷贝的区别...

  • js深拷贝浅拷贝

    目录 一.数据类型 二.浅拷贝与深拷贝 三.赋值和浅拷贝的区别 四.浅拷贝的实现方式 五.深拷贝的实现方式 一.数...

  • 深拷贝和浅拷贝

    干货!深拷贝和浅拷贝的区别 深拷贝才是拷贝,浅拷贝就是Retain Copy与Retain的区别 Copy: 根据...

网友评论

      本文标题:深拷贝与浅拷贝的区别?如何实现一个深拷贝?

      本文链接:https://www.haomeiwen.com/subject/maqgpqtx.html