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

    浅拷贝: 创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。

    深拷贝: 将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。

    浅拷贝的实现方式:

      Object.assign() 方法: 用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

      Array.prototype.slice():slice() 方法返回一个新的数组对象,这一对象是一个由 begin和end(不包括end)决定的原数组的浅拷贝。原始数组不会被改变。

      拓展运算符`…`:[...arr]

    深拷贝的实现方式:

      乞丐版: JSON.parse(JSON.stringify(object)),缺点诸多(会忽略undefined、symbol、函数;不能解决循环引用;不能处理正则、new Date())

      基础版(面试够用): 浅拷贝+递归 (只考虑了普通的 object和 array两种数据类型)

     1 function cloneDeep(target,map = new WeakMap()) {
     2   if(typeOf taret ==='object'){
     3      let cloneTarget = Array.isArray(target) ? [] : {};
     4 
     5      if(map.get(target)) {
     6         return target;
     7     }
     8      map.set(target, cloneTarget);
     9      for(const key in target){
    10         cloneTarget[key] = cloneDeep(target[key], map);
    11      }
    12      return cloneTarget
    13   }else{
    14        return target
    15   }
    16 
    17 }
     1 var deepCopy = function(obj) {
     2   if (typeof obj !== 'object') return;
     3   var newObj = obj instanceof Array ? [] : {};
     4   for (var key in obj) {
     5     if (obj.hasOwnProperty(key)) {
     6       newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];
     7     }
     8   }
     9   return newObj;
    10 }
    11 var b4 = deepCopy(a);
  • 相关阅读:
    IoC 中 car 对象的配置如下,现在要添加 user 对象,并且将 car 注入到 user 中,正确的配置是?
    说说 IoC 中的继承和 Java 继承的区别
    bean 的 scope 有几种类型?请详细列举。
    简单谈谈 IoC 容器的原理
    谈谈你对 Spring IoC 和 DI 的理解,它们有什么区别?
    day13-14 内置函数
    day12 生成器(重要)
    day11 闭包和迭代器
    day10 函数进阶
    day09 函数
  • 原文地址:https://www.cnblogs.com/ylyw/p/7687682.html
Copyright © 2011-2022 走看看