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

js浅拷贝和深拷贝

作者: pengkiw | 来源:发表于2020-06-21 14:16 被阅读0次

1⃣️ 浅拷贝

直接赋值
let obj1 = {
    name: 'kiw',
    age: 18,
}

let obj2 = obj1;
console.log(obj1); //{name: "kiw", age: 18}
obj1.age = 22;
console.log(obj2); //{name: "kiw", age: 22}
Object.assign
let obj1 = {
    a: 1,
    b: {
        c: 1
    }
}
let obj2 = {
    b: {
        d: 2,
    },
    e: 4
}

Object.assign(obj2, obj1); 
console.log(obj2);// {a: 1 b: {c: 1} e: 4}

2⃣️ 深拷贝

JSON.stringify & JSON.parse 实现深拷贝
let obj1 = {
    name: 'kiw',
    age: 18,
}

let str = JSON.stringify(obj1);
let str2 = str;
let obj2 = JSON.parse(str2)
console.log('obj2', obj2) // {name: "kiw", age: 18}
obj1.age = 22;
console.log('obj1', obj1) // {name: "kiw", age: 22}
console.log('obj2', obj2) // {name: "kiw", age: 18}

缺点:
1.如果obj里面有时间对象,则JSON.stringify后再JSON.parse的结果,时间将只是字符串的形式,而不是对象的形式

2.如果obj里有RegExp(正则表达式的缩写)、Error对象,则序列化的结果将只得到空对象

3.如果obj里有函数,undefined,则序列化的结果会把函数或 undefined丢失

4.如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null

5.?JSON.stringify()只能序列化对象的可枚举的自有属性,例如 如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor;

const test = {
    name: 'a',
    date: liai,
};
// debugger
const copyed = JSON.parse(JSON.stringify(test));
test.name = 'test'
console.log('ddd', test, copyed)

6.?如果对象中存在循环引用的情况也无法正确实现深拷贝

使用递归实现深拷贝
let checkType = data => {
    return Object.prototype.toString.call(data).slice(8, -1);
}
checkType([])
let deepClone = target => {
    let targetType = checkType(target);
    let result;
    if (targetType === 'Object') {
        result = {}
    } else if (targetType === 'Array') {
        result = []
    } else {
        return target
    }
    for (key in target) {
        let value = target[key];
        let valueType = checkType(value);
        if (valueType === 'Object' || valueType === 'Array') {
            result[key] = deepClone(value)
        } else {
            result[key] = value
        }
    }
    return result
}
let arr1 = [1, 2, { age: 18 }];
let arr2 = deepClone(arr1);
arr2[2].age = 22;
console.log('arr2', arr2)
console.log('arr1', arr1)

相关文章

  • JS中的深拷贝与浅拷贝

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

  • js浅拷贝深拷贝

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

  • 浅拷贝和深拷贝

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

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

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

  • JS中对象的复制

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

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

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

  • 通过jQuery中.extend()方法理解深拷贝

    所谓深拷贝和浅拷贝最大的区别就是js中有简单类型和引用类型的区分,对于简单类型不存在深拷贝和浅拷贝的区分,对于引用...

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

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

  • iOS面试题-第二页

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

  • iOS - copy 与 mutableCopy

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

网友评论

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

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