深拷贝与浅拷贝

举报
vike 发表于 2021/11/26 10:16:45 2021/11/26
【摘要】 浅拷贝浅拷贝是指创建一个新的数据 这个数据有原始属性值得拷贝基本类型 拷贝的就是基本类型得值引用类型 拷贝的是内存地址 // 实现一个简单的浅拷贝 let clone = (obj) => { let newObj = {} for(let prop in obj) { if(obj.hasOwnProperty(prop)){...

浅拷贝

  • 浅拷贝是指创建一个新的数据 这个数据有原始属性值得拷贝
  • 基本类型 拷贝的就是基本类型得值
  • 引用类型 拷贝的是内存地址
    // 实现一个简单的浅拷贝
    let clone = (obj) => {
        let newObj = {}
        for(let prop in obj) {
            if(obj.hasOwnProperty(prop)){
                newObj[prop] = obj[prop]
            }
        }
        return newObj
    }
  • 存在浅拷贝现象的有
  • Object.assign
  • 用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象
    let obj = {
        a:1
        b:2
    }

    let objs = Object.assign({}, obj) // {a:1,b:2}
  • slice
  • 返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝
    let arr = [1,2,3]
    let arr1 = arr.slice(0) // [1,2,3]
    arr1[0] = 6
    arr  // [6,2,3]
    arr1 // [1,2,3]
  • concat
  • 用于合并多个数组 返回一个新数组 不会改变原数组
    let arr = [1,2,3]
    let arr1 = arr.concat() // [1,2,3]
    arr1[0] = 6
    arr1 //[6,2,3]
    arr  //[1,2,3]
  • 扩展运算符 ...
    let arr = [1,2,3]
    let arr1 = [...arr]
    arr1[0] = 6
    arr1 // [6,2,3]
    arr  //[1,2,3]

深拷贝

  • 深拷贝开辟一个新的栈 对应两个不同地址
  • 常见深拷贝
  • _.cloneDeep()
    let _ = require('lodash')
    let obj = {
        a:1
        b:{c:1}
    }
    let obj2 = _.cloneDeep(obj)
    console.log(obj.b.c == obj1.b.c)  // false
  • JSON.stringify
  • 将一个 JavaScript 对象或值转换为 JSON 字符串
  • 会忽略 undefined symbol 和 函数
let obj = {a:1}
let obj1 = JSON.stringify(obj) // '{"a":1}'

手写一个深拷贝

let cloneDeep = (obj,hash = new WeakMap()) => {
    // 如果obj是null或者undefined 不进行拷贝操作直接返回
    if(obj === null) return obj
    // 如果obj是在某个实例对象的原型上 直接返回处理后的obj
    if(obj instanceof Date) return new Date(obj)
    if(obj instanceof RegExp) return new RegExp(obj)
    // 如果是函数不需要深拷贝
    if(typeof obj !== "object" ) return obj
    // 对象进行深拷贝  返回  WeakMap 指定的元素
    if(hash.get(obj)) return hash.get(obj)
    let cloneObj = new obj.constructor()
    // 找到所属类原型上的constructor
    hash.set(obj,cloneObj)
    for (let key in obj) {
        if(obj.hasOwnProperty(key)){
            // 实现一个递归拷贝
            cloneObj[key] = cloneDeep(obj[key],hash)
        }
    }
        return cloneObj
}

总结

  • 今日份小知识get~
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。