• 前端面试之浅拷贝深拷贝


    浅拷贝

    定义:对于字符串类型,浅复制是对值的复制,对于对象来说,浅复制是对对象地址的复制,并没 有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变

    方法:

    1,Object.assign

    ES6中拷贝对象的方法,接受的第一个参数是拷贝的目标target,剩下的参数是拷贝的源对象sources(可以是多个)

    let target = {};
    let source = {
        a: '123',
        b: {name: 'javascript'}
    }
    Object.assign(target,source);
    console.log(target); // {a:'123',b:{name:'javascript'}}

    Object.assign使用注意事项:

    • 只拷贝源对象的自身属性(不拷贝继承属性)
    • 不会拷贝对象不可枚举的属性
    • undefined和null无法转成对象,他们不能作为Object.assign参数,但是可以作为源对象
    • 属性名为Symbol 值的属性,可以被Object.assign拷贝

    2,Array.prototype.slice

    let array = [{a:1},{b:2}]
    let array1 = array.slice(0);
    console.log(array1)
    

    3,扩展运算符

    let obj = {a:1,b:{c:1}}
    let obj2 = {...obj}
    console.log(obj2)
    

    深拷贝

    定义: 开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性 

    // 1. JOSN.stringify()/JSON.parse()
    let obj = {a: 1, b: {x: 3}}
    JSON.parse(JSON.stringify(obj))
     
    // 2. 递归拷贝
    function deepClone(obj) {
      let copy = obj instanceof Array ? [] : {}
      for (let i in obj) {
        if (obj.hasOwnProperty(i)) {
          copy[i] = typeof obj[i] === 'object' ? deepClone(obj[i]) : obj[i]
        }
      }
      return copy
    }
    

      

  • 相关阅读:
    关于IE6不能兼容LCUC使用的PNG透明图象
    rmvb压制中高级技巧
    不错的课件网站
    C#程序多用户只启动一个进程的方法
    不可想像的加密光盘复制工具
    检测远程URL是否存在的三种方法
    请哪里有英文单词单复数转换的代码?
    一些感想,欢迎拍砖
    Some thoughts on my own O/R Mapping or Code Generation tools
    有了net send,谁还用IM?
  • 原文地址:https://www.cnblogs.com/dgqboke/p/14468893.html
Copyright © 2020-2023  润新知