zoukankan      html  css  js  c++  java
  • 浅拷贝和深拷贝

    1.浅拷贝

    // 只能实现第一层的拷贝
    var obj1 = Object.asign({}, obj)
    // 或者使用结构运算符
    obj1 = { ...obj }

    2.深拷贝

    2.1 JSON转译

    // 该方法不能拷贝undefined和函数,会忽略symbol

    1 let target = JSON.parse(JSON.stringfy(source))
    2.2 递归实现
    // 递归实现,创建一个新的空对象target,遍历源对象的key,如果该key对应的属性值不是对象,就添加改属性到target,如果是对象就继续copy函数,最后返回target
     1 function deepCopy(source){
     2   let target = {}
     3   for (const key in source) {
     4     const element = source[key];
     5     if(source.hasOwnProperty(key)){
     6       if (typeof element !== 'object') {
     7         target[key] = element
     8       } else {
     9         target[key] = deepCopy(element)
    10       }
    11     }
    12   }
    13   return target
    14 }

    数组展平的方法:

    1.先将数组转为string(此时已将数组展开,逗号分隔),再用split转为数组

     1 let a = [1,2,3]
     2 console.info(a.toString()) // "1,2,3"
     3 a = [1, 2, [3, 4]]
     4 console.info(a.toString()) // "1,2,3,4"
     5 a = [1, 2, [3, 4, [5, 6], 7], 8]
     6 console.info(a.toString()) // "1,2,3,4,5,6,7,8"
     7 let b = a.toString().split(",") 
     8 console.info(b) // ["1", "2", "3", "4", "5", "6", "7", "8"]
     9 a = [1, 2, "a", [3, 4, [5, 'c', 6], 7], 8, {}, function(){}]
    10 b = a.toString().split(",").map(item => Number.isNaN(Number(item)) ? item : Number(item))
    11 console.info(b) // [ 1, 2, 'a', 3, 4, 5, 'c', 6, 7, 8 ]

    以上只能对原始值有效,也算是一种思路。

    2.ES6新增了 flat(n)  -- 将嵌套数组展开,n参数为展开层数,可用Infinity展开全部层级

  • 相关阅读:
    Tomcat单独部署,控制台乱码解决方法
    mysql授权访问数据库
    Arrays.binarySearch采坑记录及用法
    使用Spring Ehcache二级缓存优化查询性能
    Redis批量删除缓存数据
    Java并发包之Semaphore用法
    Java并发包之CountDownLatch用法
    如何用Xshell导出文件到桌面本地
    Semaphore信号量原理
    老应用链接替换到新链接
  • 原文地址:https://www.cnblogs.com/jyughynj/p/13438919.html
Copyright © 2011-2022 走看看