首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js 深比较好

在JavaScript中,“深拷贝”(Deep Copy)是指创建一个对象的完全独立的副本,这意味着副本与原始对象没有任何关联,对副本的任何修改都不会影响到原始对象。这与“浅拷贝”(Shallow Copy)形成对比,浅拷贝只复制对象的顶层属性,如果属性值是引用类型,则复制的是引用而不是实际的对象。

深拷贝的优势

  1. 数据独立性:修改副本不会影响原始数据,保证了数据的独立性和完整性。
  2. 避免副作用:在函数式编程和数据处理中,深拷贝可以避免因意外修改原始数据而产生的副作用。
  3. 安全性:在处理敏感数据时,深拷贝可以防止数据被意外篡改。

深拷贝的类型

深拷贝可以通过多种方式实现,包括但不限于:

  1. JSON方法JSON.parse(JSON.stringify(obj))
  2. 递归函数:编写一个递归函数来复制对象的所有属性及其嵌套对象。
  3. 第三方库:如Lodash的_.cloneDeep方法。

应用场景

  • 复杂数据结构:当对象包含嵌套的对象或数组时,需要深拷贝来确保数据的独立性。
  • 函数式编程:在函数式编程中,为了避免副作用,常常需要深拷贝数据。
  • 数据备份:在备份数据时,需要创建数据的完全独立的副本。

实现深拷贝的示例代码

使用JSON方法

代码语言:txt
复制
const original = { a: 1, b: { c: 2 } };
const copy = JSON.parse(JSON.stringify(original));
copy.b.c = 3;
console.log(original.b.c); // 输出 2,原始对象未被修改

使用递归函数

代码语言:txt
复制
function deepCopy(obj) {
  if (obj === null || typeof obj !== 'object') {
    return obj;
  }
  const copy = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      copy[key] = deepCopy(obj[key]);
    }
  }
  return copy;
}

const original = { a: 1, b: { c: 2 } };
const copy = deepCopy(original);
copy.b.c = 3;
console.log(original.b.c); // 输出 2,原始对象未被修改

使用Lodash库

代码语言:txt
复制
const _ = require('lodash');
const original = { a: 1, b: { c: 2 } };
const copy = _.cloneDeep(original);
copy.b.c = 3;
console.log(original.b.c); // 输出 2,原始对象未被修改

注意事项

  • 循环引用:如果对象中存在循环引用,使用JSON方法会抛出错误,递归函数也需要特殊处理。
  • 性能问题:深拷贝可能会消耗较多的内存和处理时间,特别是对于大型复杂对象。

通过以上方法,可以根据具体需求选择合适的深拷贝实现方式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • JS深拷贝方法

    记一下js深拷贝的几种方法 使用递归 通过JSON对象 通过jQuery的extend方法 Object.assign() lodash函数 使用递归 //使用递归的方式实现数组、对象的深拷贝 function...deepClone(obj) { //判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝 var objClone = Array.isArray(obj)...[] : {}; //进行深拷贝的不能为空,并且是对象 if (obj && typeof obj === "object") { for (key in obj) { if...objClone[key] = obj[key]; } } } } return objClone; } 通过JSON对象 //通过js...= $.extend(true,[],array); Object.assign() 对象中只有一级属性,没有二级属性的时候,为深拷贝 对象中有对象的时候,在二级属性以后就是浅拷贝 lodash函数

    2.8K10

    js深拷贝浅拷贝

    device-width, initial-scale=1.0"> Document 1234567891011// 在JS..., // 也就是说当我们创建新数组newArr时,赋予newArr的是arr在栈中的地址(指针), // 其实仍与旧数组arr共享同一个内存,所以修改新数组newArr后,旧数组arr也会被修改// 深拷贝...// 它可以将复杂类型的数据相互独立出来,互不影响 // 深拷贝不会拷贝引用类型的引用,而是将引用类型的值全部拷贝一份,形成一个新的引用类型, // 这样就不会发生引用错乱的问题,使得我们可以多次使用同样的数据...obj //基本类型直接拷贝 } return result; } // 2、 function deepClone(target) { // 定义一个变量 let result; // 如果当前需要深拷贝的是一个对象的话更多内容请见原文

    2.5K20

    js如何实现深拷贝

    深拷贝是一种常见的操作,用于创建原对象的完全独立副本,避免原对象和副本之间的数据共享。深拷贝不仅复制了对象的第一层结构,还会递归复制所有嵌套的对象和数组,确保副本是完全独立的什么叫做深拷贝?...由此看来在处理复杂的数据结构时,深拷贝通常是更为可靠的选择。因为深拷贝是一种更加彻底和安全的复制方式,可以保证复制后的对象与原始对象之间完全独立,不会相互影响。...js实现深拷贝的几种方式1.递归实现递归是实现深拷贝的一种常见方式。通过递归遍历对象的所有属性,对每个属性进行复制,如果属性的值是对象或数组,则递归调用深拷贝函数。...JSON序列化与反序列化另一种实现深拷贝的方式是利用JSON的序列化和反序列化。通过将对象转换为JSON字符串,再将JSON字符串转换回对象,可以实现深拷贝的效果。...这样就可以实现一个带有特殊写法的深拷贝函数。需要注意的是,使用Proxy对象实现深拷贝虽然比较巧妙和骚气,但也可能会增加代码的复杂性和理解难度。

    12110

    JS深拷贝几种实现方法

    1、使用递归(循环)的方式实现深拷贝 //使用递归的方式实现数组、对象的深拷贝 function deepClone1(obj) { //判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝...,对象的话进行对象拷贝 //进行深拷贝的不能为空,并且是对象或者是 if (obj && typeof obj === "object") { var objClone = Array.isArray...objClone[key] = obj[key]; } } } return objClone; } return obj; } 2、lodash函数库实现深拷贝...lodash很热门的函数库,提供了 lodash.cloneDeep()实现深拷贝 3、通过 JSON 对象实现深拷贝 //通过js的内置对象JSON来进行数组对象的深拷贝 function deepClone2...objClone = JSON.parse(_obj); return objClone; } 4、Object.assign()拷贝(并不深,一级拷贝) 当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝

    1.6K20

    JS 数组、对象的深拷贝

    博客地址:https://ainyi.com/72 JavaScript 程序中,对于简单的数字、字符串可以通过 = 赋值拷贝 但是对于数组、对象、对象数组的拷贝,就有浅拷贝和深拷贝之分 浅拷贝就是当改变了拷贝后的数据...,原数据也会相应改变 来说说深拷贝 数组深拷贝 遍历赋值 不推荐此方法 let a = [1, 2, 3] let b = [] for (let val of a) { b.push(val) }.../ [1, 2, 3, 4] let a = [1, 2, 3] let b = Array.from(a) b.push(4) a // [1, 2, 3] b // [1, 2, 3, 4] 对象深拷贝...,但是对于二维数组、对象数组、对象里包含对象,以上方法均达不到深拷贝方法 以上只能达到数组、对象的第一层的==深拷贝==,对于里面的数组或对象属性则是==浅拷贝==,因为里面的内存地址只是拷贝了一份,但都是指向...cloneDeep 使用 lodash 插件的深拷贝方法 // 官方例子 var objects = [{ 'a': 1 }, { 'b': 2 }]; var deep = _.cloneDeep

    8.3K30

    JS 深拷贝与浅拷贝

    其实在工作写代码和面试中,会经常碰到这两个概念:深拷贝,浅拷贝。但今天的重点是深拷贝。 下面我将简单介绍下什么是深拷贝,浅拷贝?...深拷贝是将一个Object对象的内容完全拷贝一份给新对象。修改原对象的属性或者属性值,都不会影响新对象。原对象和新对象是完全独立的,互不影响。...今天的重点是深拷贝,浅拷贝没啥可讲的。 talk is cheap,show me the code! 上浅拷贝代码: function shallowCopy(obj) { if (!...3.观察obj3和obj1,可以知道利用JSON.stringify、JSON.parse实现的深拷贝,是可以实现深拷贝的。 我们再给对象加多点属性,比如加个函数。...所以通过JSON.parse和JSON.stringify实现的深拷贝不完美。 那么我分享下我自己写的一个对象深拷贝的方法,这就是我个人比较常用的方案了。

    2.1K10

    js浅拷贝与深拷贝

    如果有引用类型,那么存在被篡改的风险,更应该使用深拷贝 浅拷贝方法 1、手撸一个浅拷贝函数 1function shallowClone(obj) { 2 const newObj = {};...完全拷贝了基本类型和引用类型内部所有数据,叫深拷贝 深拷贝方法 1、JSON暴力转换 1const obj2=JSON.parse(JSON.stringify(obj1)); 但是这种方式存在弊端,...Symbol("A") 7} 8const obj2 = JSON.parse(JSON.stringify(obj)); 9console.log(obj2); // {name: "A"} 2、手撸深拷贝函数...new Date(obj); 4 if (obj instanceof RegExp) return new RegExp(obj); 5 // 可能是对象或者普通的值 如果是函数的话是不需要深拷贝...== "object") return obj; 7 // 是对象的话就要进行深拷贝 8 if (hash.get(obj)) return hash.get(obj); 9 let cloneObj

    1.1K10

    js库 - 浅拷贝 & 深拷贝

    栈内存中简单数据类型直接拷贝就能得到一个副本,但是复杂数据类型的拷贝如果也想得到一个副本,就需要深拷贝了。...深拷贝 具体深拷贝就是要理解了复杂类型拷贝的缺点,然后再进行弥补。 既然想要复杂类型也像简单类型那样拷贝一个新数据的话,就不单单是拷贝地址了。...但其实在深拷贝阶段,直接将其放到object形式处理了。...然后就是深拷贝的代码: deepClone: function (origin) { /* * @Author: guojufeng@ * @Date: 2018-10-30 20...如果循环过程中,数组中嵌套复杂类型,再次递归调用深拷贝方法。 对于对象,新建一个对象,然后for in遍历拷贝非原型值。如果循环过程中,对象中嵌套复杂类型,再次递归调用深拷贝方法。

    2.1K30

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券