• 关于对象的深拷贝和浅拷贝


    • 浅拷贝(对象内存地址不同了,但是对象内部的引用类型的内存地址还是原来的值)
    1 const obj = {
    2     a: 100,
    3     b: [10,20,30],
    4     c: {
    5         x: 10    
    6     },
    7     d: /^d+$/
    8 }
    1 // 浅拷贝(一层) 不推荐
    2 const obj2 = {}
    3 for (let key in obj) {
    4     if (!obj.hasOwnProperty(key)) break;
    5     obj2[key] = obj[key]
    6 }
    7 // const obj2 = {...obj} 
    • 深拷贝

            自己项目中会用 JSON.parse(JSON.stringify(obj)) ,一般也够用了。但这方法有个弊端:对函数,正则,时间对象,数字对象等时,不适用,会有问题(函数被忽略,正则变为对象等)。而一些js库,如lodash,也有深拷贝的方法,比较复杂了。可以自己实现一个深拷贝的方法。

     1 // 深拷贝实现
     2 function deepClone(obj) {
     3     // 过滤特殊情况
     4     if (obj === nullreturn null;
     5     if (obj instanceof Function) {
     6         return new Function(obj);
     7     }
     8     if (typeof obj !== 'object') return obj;
     9     if (obj instanceof RegExp) {
    10         return new RegExp(obj);
    11     }
    12     if (obj instanceof Date) {
    13         return new Date(obj);
    14     }
    15     // 不直接创建空对象:克隆的结果和之前保持相同的所属类
    16     const newObj = new obj.constructor(obj)
    17     for (let key in obj) {
    18         if (obj.hasOwnProperty(key)) {
    19             newObj[key] = deepClone(obj[key])
    20         }
    21     }
    22     return newObj;
    23 }
  • 相关阅读:
    查看文件的首尾行
    快捷键
    lua中奇葩用法
    lua中特殊用法
    CVPR2015一些文章整理
    hdu5371 最长回文子串变形(Manacher算法)
    SVN合并(merge)的使用
    atitit. 集合groupby 的实现(2)---自己定义linq查询--java .net php
    王立平--SQLite,SQLiteOpenHelper的简单应用
    Vim 经常使用快捷键及键盘图
  • 原文地址:https://www.cnblogs.com/scallop/p/14517806.html
Copyright © 2020-2023  润新知