结构化克隆算法与深度复制算法有何不同?

How is structured clone algorithm different from deep copy

本文关键字:算法 何不同 复制 结构化 深度      更新时间:2023-09-26

有一篇MDN文章指出:

结构化克隆算法是HTML5定义的一种新算法序列化复杂JavaScript对象的规范。它更

所以,我相信这意味着它比用这种方式克隆更有能力:

JSON.parse(JSON.stringify(obj))

建议在这个线程。JSON的方式有很多缺点,比如不支持循环引用,放弃JSON规范中不支持的所有东西,比如函数,以及将Date对象表示为字符串。

我认为结构化克隆算法是由许多库实现的深度复制算法。然而,它与

这几个字列在同一页上:

如果你想要一个对象的深度拷贝(即所有对象的递归拷贝)嵌套属性(遍历原型链),必须使用另一个的方法。下面是一个可能的例子:

所以现在我很困惑,不知道什么是结构化算法,也不知道它与深度复制有什么不同。任何帮助吗?我不想读规范,也许一些库实现了它,所以我可以读他们的源代码。

结构化克隆算法是深度复制JavaScript object的方法之一。由于这个api不是直接公开的,所以我们有其他方法可以使用它。

如果我们有JSON,我们为什么要使用它呢?json。stringify?

因为JSON.parse(JSON.stringify(obj))有一些限制,就像你提到的,它们不序列化循环对象或Map, Set, Date, RegEx等

这就是这个api(Structure clone)发挥作用的地方。

如何使用?

因为这个api(结构化克隆)不是直接暴露的,但它被其他一些api使用。因此,为了使用结构化克隆,我们可以使用其他api。

这些api有:

  1. history.pushState
  2. MessageChannel
  3. Notification
要查看这些api的示例和比较,我强烈推荐Surma blogpost。

所以,最后结构化克隆api直接暴露在一些浏览器中(见支持的版本和覆盖范围),函数名为structuredClone()

如何使用?

日期对象的例子:

const a = { x: 20, date: new Date() };
const b = structuredClone(a); // { x: 20, date: <date object> }

注意:对于JSON.stringify,日期对象将被Date.prototype.toJSON

序列化。

圆形对象的例子:

const a = { x: 20, date: new Date() };
a.c = a;
const b = structuredClone(a); // { x: 20, date: <date object>, c: <circular ref> }

注意:对于JSON.stringify,它将抛出TypeError

我知道这个问题是几年前问的,几乎没有任何活动,但值得结束所有未回答的问题。

在同一篇文章中,现在出现了一个注释:

该规范用于定义"结构化克隆"算法,以及最近的StructuredClone抽象操作。然而,在实践中,它的所有已知用途都可以通过单独的序列化和反序列化步骤得到更好的服务,所以它被删除了。

这意味着问题的前提不再存在。

简而言之:不存在结构化克隆算法。