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

Javascript 结构化克隆算法与深度复制算法有何不同,javascript,Javascript,有一种说法是: 结构化克隆算法是HTML5定义的一种新算法 序列化复杂JavaScript对象的规范。更多 比JSON更强大 因此,我相信这意味着它在这方面比克隆更有能力: JSON.parse(JSON.stringify(obj)) 在中建议。JSON方式有许多缺点,比如不支持循环引用、删除JSON规范不支持的所有内容(如函数)以及将日期对象表示为字符串 然后我认为结构化克隆算法是许多库实现的深度复制算法。但是,在同一页上列出了以下文字: 如果需要对象的深度副本(即所有对象的递归副本 嵌套

有一种说法是:

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

因此,我相信这意味着它在这方面比克隆更有能力:

JSON.parse(JSON.stringify(obj))
在中建议。JSON方式有许多缺点,比如不支持循环引用、删除JSON规范不支持的所有内容(如函数)以及将日期对象表示为字符串

然后我认为结构化克隆算法是许多库实现的深度复制算法。但是,在同一页上列出了以下文字:

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


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

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

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

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

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


简而言之:没有结构化克隆算法

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

如果我们有JSON.parse和JSON.stringify,为什么还要使用它呢?

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

因此,这就是这个api(结构克隆)发挥作用的地方

如何使用它?

因为此api(结构克隆)不是直接公开的,而是由其他一些api使用的。因此,我们可以使用其他API来使用结构克隆

这些API包括:

  • history.pushState
  • MessageChannel
  • 通知

  • 要查看这些API之间的示例和比较,我强烈建议Surma

    MDN可以由任何人编辑。深度克隆的例子没有位置。@Ryan
    如果你不使用代码格式来强调,我们可能是朋友。
    :)很好的信息事实上,算法仍然存在,并且已经被描述过了。具体在哪里?这就是我引用的地方,唯一的structuredclone关键字是在我引用的文本中