美文网首页
2019-01-23 JS 浅复制和深复制

2019-01-23 JS 浅复制和深复制

作者: rub1cky | 来源:发表于2019-01-23 09:56 被阅读0次

由于js中对象的赋值是引用类型, 当更改一个对象的值是, 另外一个对象的值也会相应的改变, 所以会存在浅拷贝和深拷贝
我也是阅读掘金的一篇文章, 借此复习一下

本文所有代码都是 typescript 实现, 借此复习typescript用法

  • 简书在书写typescript代码的时候加上typescript会有高亮
    1.浅拷贝
// 继承Object 对象, 实现Object原型上的方法
interface DefineObj extends Object { 
    [key: string] : any
}
var clone = (obj: DefineObj) => {
    let c: DefineObj = {} // 定义一个新对象
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            c[key] = obj[key]
        }
    }
    return c
}

let aa = {
    x : 1,
    y : 'string',
    z : null,
    b : undefined,
    q: {x: 1}
}

let b = clone(aa)
console.log(b, aa==b) 
aa.q.z = 10
console.log(b.q.z) // 10
/**
Object {x: 1, y: "string", z: null, b: undefined}
deepClone.js:18
false
*/

问题 当改变对象中的对象时, 引用对象也会因此改变
解决方法: 当函数值为对象的时候,进行循环引用

// 是否是对象
function isObject(obj: DefineObj) {
    return Object.prototype.toString.call(obj) === '[object Object]'
}

函数完善

var clone = (obj: DefineObj) => {
    let c: DefineObj = {} // 定义一个新对象
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            if (isObject()) {
                c[key] = clone(obj[key])  // 函数循环引用
            } else {
                c[key] = obj[key]
            }
        }
    }
    return c
}

完善数组对象

判断是否是数组
function isArray(obj: DefineObj) {
    return Object.prototype.toString.call(obj) === '[object Array]'
}

var clone = (obj: DefineObj) => {
    let c: DefineObj = isArray(obj) ? [] : {} // 判断是否为数组
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            if (isObject()) {
                c[key] = clone(obj[key])  // 函数循环引用
            } else {
                c[key] = obj[key]
            }
        }
    }
    return c
}

相关文章

  • 浅拷贝和深拷贝

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

  • 2019-01-23 JS 浅复制和深复制

    由于js中对象的赋值是引用类型, 当更改一个对象的值是, 另外一个对象的值也会相应的改变, 所以会存在浅拷贝和深拷...

  • javascript 数组以及对象的深拷贝

    数组的深拷贝在js中,数组和对象的复制如果使用=号来进行复制,那只是浅拷贝。如下图演示: for 循环实现数组的深...

  • js深复制和浅复制

    javaScript的变量类型 基本类型:5种基本数据类型Undefined、Null、Boolean、Numbe...

  • js中对象的复制,浅复制(浅拷贝)和深复制(深拷贝)

    在js中,我们经常复制一个对象,复制数据,那么就会有人问了,怎么复制,今天鹏哥就带来js中的复制方法。 JS中对象...

  • 深拷贝与浅拷贝的理解及常用方法

    深拷贝和浅拷贝的区别 首先深复制和浅复制只针对像 Object, Array 这样的复杂对象的。简单来说,浅复制只...

  • js 对象小结

    对象的深复制和浅复制 深复制: 在对象的json是安全的情况下,使用varnewObj=JSON.parse(JS...

  • java 对象的拷贝

    拷贝:即复制 对象拷贝:即对象复制 java 对象拷贝分类:浅拷贝、深拷贝 java 对象的浅拷贝和深拷贝针对包含...

  • iOS全解11:特殊问题

    1、浅拷贝和深拷贝的区别? 浅拷贝:只复制指向对象的指针,指针指向同一个地址,而不复制引用对象本身。深拷贝:复制引...

  • Javascript对象的深浅拷贝

    开门见山,有人叫对象的复制为深复制浅复制,也有人叫深拷贝浅拷贝。其实都是copy。 深拷贝(递归复制,复制所有层级...

网友评论

      本文标题:2019-01-23 JS 浅复制和深复制

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