一个例子 - 看尽JS的深度克隆

  1. 在JS中的等于号都是把对象的地址引用了,所有普通的赋值或者是Object.assign都是浅克隆,那么怎么深克隆呢
  2. 基本思想就是遍历对象,一个一个赋值
  3. 遇到对象或者数组的化递归
function deepClone(parent, child) {
    child = child || {};
    for (const key in parent) {
        if (parent.hasOwnProperty(key)) {
            let item = parent[key];
            if (typeof item === "object") {
                child[key] = Object.prototype.toString.call(item) === "[object Array]" ? [] : {};
                deepClone(item,child[key],);
            } else {
                child[key] = item;
            }
        }
    }
    return child;
}

let a = {a:1,b:{c:3,d: [6,5,4,3]}}
let b = {};
 b = deepClone(a,b);
console.log(a,b)

这里有几个点需要注意以下

在遍历目标对象的时候,首先需要属性是不是对象,不是的话,证明是基本类型对不,那么就可以直接赋值了,因为基本类型在内存中的栈里存的就是真实值
如果是对象或者数组的化,那么需要递归调用这个对象,直到是基本类型为止

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,136评论 1 32
  • 三,字符串扩展 3.1 Unicode表示法 ES6 做出了改进,只要将码点放入大括号,就能正确解读该字符。有了这...
    eastbaby阅读 1,561评论 0 8
  • 本文为阮一峰大神的《ECMAScript 6 入门》的个人版提纯! babel babel负责将JS高级语法转义,...
    Devildi已被占用阅读 2,021评论 0 4
  • 1.属性的简洁表示法 允许直接写入变量和函数 上面代码表明,ES6 允许在对象之中,直接写变量。这时,属性名为变量...
    雨飞飞雨阅读 1,147评论 0 3
  • 不知道从什么时候开始,礼貌用语,良好的分寸感被我丢得越来越远。本来认识没有多久的人,非要装得跟他/她很熟,认识多久...
    哥哥你会发光耶阅读 573评论 3 3