美文网首页
js深拷贝、浅拷贝

js深拷贝、浅拷贝

作者: 喵喵同学嘛 | 来源:发表于2019-04-18 17:27 被阅读0次

1. 基本介绍

在js中有两种数据类型,基本数据类型和引用数据类型,我们知道对其赋值操作的时候,对于基本数据类型,会直接把其值赋值给另外一个对象,但是对于引用数据类型,赋值的只是栈中的地址,其实指向的还是堆中的同一个对象,并不会创建新的对象。
那么如何进行拷贝呢

2. 浅拷贝

1、for in 循环
2、直接赋值
3、Object.assign(其实他的第一层是深拷贝,后面的是浅拷贝)

3. 深拷贝

1. JSON.parse(JSON.stringfy(obj))

这个会存在一些问题:

  1. 他无法实现对函数 、RegExp等特殊对象的克隆
  2. 会抛弃对象的constructor,所有的构造函数会指向Object
  3. 对象有循环引用,会报错

2. 自己手写一个

function DeepCopy(obj){
    if(typeof obj!=='object'&& typeof obj !=='function') //基本类型
    return obj
    let newobj=Array.isArray(obj)?[]:{} 
    for(key in obj){
        if(obj.hasOwnProperty(key)){ //是否是自己的属性,而不是原型对象上的属性
            newobj[key]=typeof obj[key]==='object'?DeepCopy(obj[key]):obj[key]
        }
    }
    return newobj
}

其实这个也是存在问题的,

  1. 对于正则表达式并不能复制
  2. 会抛弃对象的constructor,所有的构造函数会指向Object,如下图所示
image.png

要想真正的实现一个深拷贝,要进行对不同类型的判断作特殊处理

在实际项目中,还是要看具体情况来选择,如果属性的类型丰富,不确定,特别严格的话还是建议使用lodash库去实现

相关文章

  • JS中的深拷贝与浅拷贝

    知乎:js中的深拷贝和浅拷贝? 掘金: js 深拷贝 vs 浅拷贝 前言 首先深拷贝与浅拷贝只针对 Object,...

  • js浅拷贝深拷贝

    js浅拷贝,深拷贝的简单实现 基础数据 浅拷贝 深拷贝

  • 浅拷贝和深拷贝

    本文参考:JavaScript中的浅拷贝和深拷贝js 深拷贝 vs 浅拷贝深入剖析 JavaScript 的深复制...

  • JS实现深拷贝、instanceof、判断是否为数组

    JS深拷贝 JS中拷贝对象可以按照拷贝的程度可以分为浅拷贝和深拷贝,有些时候我们需要拷贝之后的对象和拷贝之前的对象...

  • JS中对象的复制

    JS中的对象复制分为两种情况:深拷贝和浅拷贝。深拷贝和浅拷贝的区别在于对数组和对象的拷贝,对它们拷贝时浅拷贝只是拷...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • 2020前端高频面试题总结(附答案)

    [ js基础题 ] 1. new的实现原理是什么? 2. 深拷贝和浅拷贝的区别是什么 深拷贝 浅拷贝 3. bin...

  • iOS - copy 与 mutableCopy

    一说到拷贝,就不得不提浅拷贝和深拷贝。 何谓浅拷贝?何谓深拷贝? 往简单的说: 浅拷贝:拷贝地址。 深拷贝:拷贝内...

  • iOS面试题-第二页

    11.深拷贝和浅拷贝的理解. 深拷贝;拷贝的内容. 浅拷贝:拷贝的指针. 深拷贝如: NSMutableDicti...

  • JS 浅拷贝深拷贝

    浅拷贝 Object.assign Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象...

网友评论

      本文标题:js深拷贝、浅拷贝

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