当前位置: 首页 > 面试题库 >

在JavaScript中深度clone对象的最有效方法是什么?

姬熙云
2023-03-14
问题内容

clone JavaScript对象的最有效方法是什么?我见过obj = eval(uneval(o));使用它,但这是非标准的,仅受Firefox支持。

我做了类似的事情,obj = JSON.parse(JSON.stringify(o));但对效率提出了质疑。

我还看到了具有各种缺陷的递归复制功能。
我很惊讶没有规范的解决方案存在。


问题答案:

如果不使用DateS,功能undefinedInfinity,正则表达式,Maps, Sets, Blobs,的文件列表,ImageDatas,稀疏数组,类型化数组或其他复杂类型的对象中,一个很简单的一个衬垫深克隆的对象是:

JSON.parse(JSON.stringify(object))

const a = {

  string: 'string',

  number: 123,

  bool: false,

  nul: null,

  date: new Date(),  // stringified

  undef: undefined,  // lost

  inf: Infinity,  // forced to 'null'

  re: /.*/,  // lost

}

console.log(a);

console.log(typeof a.date);  // Date object

const clone = JSON.parse(JSON.stringify(a));

console.log(clone);

console.log(typeof clone.date);  // result of .toISOString()

Reliable cloning using a library

由于cloning objects并非易事(复杂类型,循环引用,函数等),因此大多数主要库都提供了用于克隆对象的函数。 Don’t reinvent the wheel如果您已经在使用库,请检查它是否具有对象cloning功能。例如,

  • odash- cloneDeep; 可以通过lodash.clonedeep模块单独导入,如果您尚未使用提供深度克隆功能的库,则可能是您的最佳选择
  • AngularJS- angular.copy
  • jQuery- jQuery.extend(true, { }, oldObject); .clone()仅cloning DOM元素

ES6

为了完整起见,请注意ES6提供了两种浅表复制机制:Object.assign()和扩展语法。它将所有可枚举的自身属性的值从一个对象复制到另一个对象。例如:

var A1 = {a: "2"};
var A2 = Object.assign({}, A1);
var A3 = {...A1};  // Spread Syntax


 类似资料:
  • 问题内容: 给定一个有效的CSS颜色值的字符串: ffffff 白色 rgb(255,255,255) 需要获取以下格式的数字数组:[R,G,B] 用JavaScript(假设使用主要的浏览器)最有效的方法是什么? 问题答案: 显然,数值比名称更容易解析。所以我们先做那些。 那是一个 现在获取完整的六位数格式: 现在是格式: 另外,您还可以添加支持的格式,甚至/ 如果添加HSL2RGB转换功能。

  • 问题内容: 在数组中对对象进行分组的最有效方法是什么? 例如,给定此对象数组: 我正在表格中显示此信息。我想对不同的方法进行分组,但是我想对这些值求和。 我将Underscore.js用于其groupby函数,这很有用,但并不能解决所有问题,因为我不希望它们“分裂”而是“合并”,更像SQL 方法。 我正在寻找的是能够总计特定值(如果要求)。 因此,如果我进行了groupby ,我希望收到: 如果我

  • 问题内容: 好吧,我有两个StringBuilder对象,我需要在Java中对其进行比较。我知道我可以做的一种方法是 但这意味着我要创建两个String对象,还有没有更好的方法来比较StringBuilder对象。也许您不需要创建其他对象的地方? 问题答案: 如您所知,继承自,因此仅在将同一对象作为参数传递时才返回true。它并 没有 比较两个内容小号! 如果您查看源代码,您将得出结论,最有效的比

  • 问题内容: 根据JAVA文档,当调用super.clone()时,将返回对象的浅表副本。在下面的代码中,我有两个对象 name 和 id ;和一个基本变量 num 。当在第一个对象上调用super.clone()方法时,除了预期的num副本外,它似乎还在创建对象的深层副本(名称和ID)。克隆对象obj之后,我更改了它的名称和id字段。如果正在制作浅表副本,则这些更改应反映在克隆的对象中。我对吗?

  • 本文向大家介绍javascript中clone对象详解,包括了javascript中clone对象详解的使用技巧和注意事项,需要的朋友参考一下   开发中,打断对象间的引用关系,只想下个副本的情况无处不在,clone一个对象就在所难免了。   JavaScript中,简单的方法就是用JSON函数,将对象stringify成字符串,再parse成一个新对象。要么就是从网上搜个代码,开源社区里面clo

  • 问题内容: 我在生产中有20GB +的rdb转储。我怀疑有一组特定的按键使它blo肿。我希望有一种方法可以始终从静态转储分析中发现前100个最大对象,或者将其询问给服务器本身,而服务器本身有7M个对象。 像rdbtools这样的转储分析工具在这个(我认为)非常常见的用例中无济于事! 我当时想编写一个脚本,并使用“ redis-cli调试对象”对整个键集进行迭代,但是我感觉必须缺少某些工具。 问题答