zoukankan      html  css  js  c++  java
  • 克隆与深度克隆

    1.浅克隆

    var lilei = {
    sname: "lilei",
    sage: 20,
    intr() {
    console.log(`我是${this.sname},今年${this.sage}`);
    }
    }
    // lilei.intr()

    function clone(obj) {
    var newObj = {};
    for (var key in obj) {
    newObj[key] = obj[key];
    }
    return newObj;
    }
    var hmm = clone(lilei);
    console.log(hmm);

    2.深度克隆

    function checkType(data) { // 用来判断被拷贝对象数据类型的函数
    return Object.prototype.toString.call(data).slice(8, -1)
    }
    function deepClone(target) { // 实现深度拷贝的函数
    var result, targetType = checkType(target);//Array Object
    if (targetType === 'Object') { // 只有对象和数组才进行深度拷贝
    result = {}
    } else if (targetType === 'Array') {
    result = []
    } else {//如果return 证明target是基本数据类型,并且将整个函数结束了
    return target
    }
    for (var i in target) { // i为对象的key或数组的下标
    //获取属性名为i的属性值
    var value = target[i]
    // 检测当前属性的类型
    var valueType = checkType(value);//String Number Array
    if (valueType === 'Object' || valueType === 'Array') {
    result[i] = deepClone(value) // 当拷贝的对象中还有数组或是对象时进行递归,克隆它们中的内容,直到递归完所有数组或对象为止
    } else {
    result[i] = value
    }
    }
    return result // 返回最终的结果
    }
    var arr = [1,2,{username:"xiaohu"}]
    var arr2 = deepClone(arr)
    arr2[2].username = "dahu"
    console.log(arr)
    console.log(arr2)

  • 相关阅读:
    新项目调试思路
    cmstop核心
    jquery获取li中的各项属性值attr
    mysql表设计
    SQLServer系统表使用简介(sysobjects、syscolumns、syscomments等)转载
    死锁查询和处理
    this 关键字的用法
    C# 线程
    C# WCF的通信模式
    C# WCF之用接口创建服务契约、部署及客户端连接
  • 原文地址:https://www.cnblogs.com/zhanghaifeng123/p/12046074.html
Copyright © 2011-2022 走看看