[JavaScript]对象浅拷贝、深拷贝常用

浅拷贝:
1.  扩展运算符:...
            let person = {name:'tom',age:18}
            let person2 = {...person}
2. 合并两个对象:Object.assign({}, obj1, obj2)

针对深拷贝, 需要使用其他办法,因为 Object.assign() 只复制属性值。

假如源对象是一个对象的引用,它仅仅会复制其引用值。

 
 
'element‘ in obj
 
JSON.stringify( obj ) 
 
JSON.parse( JSON.stringify( obj ) )   可以用作简单对象的深复制。只能负责属性值,不能复制方法。
 
 
深拷贝尝试:
复制代码
// 深度拷贝
function judgeType(obj) {
    // tostring会返回对应不同的标签的构造函数
    const toString = Object.prototype.toString
    const map = {
        '[object Boolean]': 'boolean',
        '[object Number]': 'number',
        '[object String]': 'string',
        '[object Function]': 'function',
        '[object Array]': 'array',
        '[object Date]': 'date',
        '[object RegExp]': 'regExp',
        '[object Undefined]': 'undefined',
        '[object Null]': 'null',
        '[object Object]': 'object'
    }
    if (obj instanceof Element) {
        return 'element'
    }
    return map[toString.call(obj)]
}
module.exports = deepClone = function(data) {
    const type = judgeType(data)
    let obj
    if (type === 'array') {
        obj = []
    } else if (type === 'object') {
        obj = {}
    } else {
        // 不再具有下一层次
        return data
    }
    if (type === 'array') {
        for (let i = 0, len = data.length; i < len; i++) {
            obj.push(deepClone(data[i]))
        }
    } else if (type === 'object') {
        // 对原型上的方法也拷贝了....
        for (const key in data) {
            obj[key] = deepClone(data[key])
        }
    }
    return obj
}
复制代码

 

 
 
posted @   夕苜19  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示