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

深拷贝、浅拷贝

作者: 清苑折纸 | 来源:发表于2021-07-26 11:19 被阅读0次

深拷贝和浅拷贝只针对引用数据类型,比如Object和Array
深拷贝:从A拷贝到B,当A发生改变时B不会变;
浅拷贝:从A拷贝到B,当A发生变化时B也会变,此时是只复制了指向对象的指针而没有复制对象的值。

浅拷贝

  • 循环
function shallowCopy(oldObj){
    var newObj = {}
    for(var i in oldObj){
        if(oldObj.hasOwnProperty(i)){
            newObj[i] = oldObj[i]
        }
    }
    return newObj
}
  • object.assign(target, source):
    将所有可枚举值从一个或多个源对象复制到目标对象,会修改目标对象,可将目标对象设置为空。
Object.assign( {} , source,source);

当对象只有一级属性没有二级属性的时候,属于深拷贝,但是当对象中还有对象时,在二级属性后就属于浅拷贝。

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(target); // { a: 1, b: 4, c: 5 }
console.log(returnedTarget); // Object { a: 1, b: 4, c: 5 }
console.log(target) // {a: 1, b: 4, c: 5}
第一级是深拷贝:
let a = {James: {age: 18}}
let b = Object.assign({}, a)
b.James = 20
console.log(b) // { James: 20 }
console.log(a) // { James: { age: 18 } }
以后各级是浅拷贝:
let a = {James: {age: 18}
let b = Object.assign({}, a)
b.James.age = 20
console.log(b) // { James: { age: 20 } }
console.log(a) // { James: { age: 20 } } //源对象a也被修改
  • Array.prototype.concat()


  • Array.prototype.slice()



    concat和slice都不会修改原数组,只会返回一个浅复制了原数组中的元素的一个新数组。
    如果原数组的元素是对象引用,则slice会拷贝引用到新数组;
    如果是字符串、数字和布尔值,则拷贝值到新对象,此时修改其中一个数组的值时不会影响另一个数组。

深拷贝

  • 手动拷贝
var obj1 = { a: 10, b: 20, c: 30 };
var obj2 = { a: obj1.a, b: obj1.b, c: obj1.c };
obj2.b = 100;
console.log(obj1);
// { a: 10, b: 20, c: 30 } <-- 沒被改到
console.log(obj2);
// { a: 10, b: 100, c: 30 }
  • JSON.parse(JSON.stringify()),不能拷贝对象中的方法
let arr = [1, 2, {
    username: 'aa'
    }];
let arr2=JSON.parse(JSON.stringify(arr));
arr2[2].username = 'bb';
console.log(arr,arr2);
  • JQuery的extend
var obj1 = {
    a: 1,
    b: { f: { g: 1 } },
    c: [1, 2, 3]
};
var obj2 = $.extend(true, {}, obj1);
console.log(obj1.b.f === obj2.b.f);
// false
  • 递归方法
function deepCopy(oldObj){
    var newObj = {}
    for(var key in oldObj){
        if(typeof oldObj[key] === 'object'){
            newObj[key] = deepCopy(oldObj[key])
        }else{
            newObj[key] = oldObj[key]
        }
    }
    return newObj
}

相关文章

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

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

  • iOS - copy 与 mutableCopy

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

  • iOS面试题-第二页

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

  • js浅拷贝深拷贝

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

  • JS中的深拷贝与浅拷贝

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

  • iOS--拷贝相关题

    1、什么是深拷贝什么是浅拷贝?浅拷贝和深拷贝的区别 * 浅拷贝(shallow copy):指针拷贝,对于被拷贝对...

  • 2018-10-10day9函数基础

    1.浅拷贝、深拷贝 copy.copy(对象):浅拷贝copy.deepcopy(对象):深拷贝""" """拷贝...

  • 2018-10-10函数基础

    深拷贝和浅拷贝 深拷贝 copy.deepcopy(对象)浅拷贝 copy.copy(对象)深拷贝: 将对象对应的...

  • 深拷贝和浅拷贝

    1.深拷贝:地址的拷贝 2.浅拷贝:是值得拷贝 深拷贝和浅拷贝的区别 A拷贝B B变A变是浅拷贝 A拷贝B B变A...

  • 对象深拷贝和浅拷贝

    浅拷贝 深拷贝 深拷贝的递归方法 深拷贝的JSON方法

网友评论

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

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