- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
有一个 MDN article声明:
The structured clone algorithm is a new algorithm defined by the HTML5 specification for serializing complex JavaScript objects. It's more capable than JSON
所以,我相信这意味着它比以这种方式克隆的能力更强:
JSON.parse(JSON.stringify(obj))
在 this thread 中建议. JSON 方式有很多缺点,例如不支持循环引用、丢弃 JSON 规范不支持的所有内容(如函数)以及将 Date 对象表示为字符串。
然后我想到结构化克隆算法是很多库实现的深拷贝算法。但是,它在同一页上列出了以下文字:
If you want a deep copy of an object (that is, a recursive copy of all nested properties, walking the prototype chain), you must use another approach. The following is a possible example.
所以现在我很困惑,不知道什么是结构化算法,也不知道它与深拷贝有何不同。有什么帮助吗?我不想阅读规范,也许某些库实现了它,所以我可以阅读它们的源代码。
最佳答案
Structued Clone Algorithm 是深度复制 JavaScript 对象
的方法之一。由于此 API 未直接公开,因此我们可以通过其他方式使用它。
如果我们有 JSON.parse 和 JSON.stringify 为什么还要使用它?
Because JSON.parse(JSON.stringify(obj)) has some limitations like you have mentioned, which are, they do not serialize the circular object or things like Map, Set, Date, RegEx etc.
所以,这就是这个 api(Structure clone)发挥作用的地方。
如何使用?
Since this api(Structured Cloning) is not directly exposed but it is used by some other apis. So we can use those other apis in order to use Structured Cloning.
这些 api 是:
history.pushState
消息 channel
通知
要查看这些 api 的示例和比较,我强烈推荐 Surma blogpost .
更新
因此,最终 Structured Clone api 以函数名 structuredClone()
直接暴露在某些浏览器中(see supported versions and coverage)。
如何使用?
带有日期对象的例子:
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
关于javascript - 结构化克隆算法与深拷贝有何不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40488190/
拿这个: var lists:{ item1:{} ,item2:{} ,item3:{} ,item4:{} } 由于它基本上是空的,我想要一个函数(可能但不一定是 _lodash
我想更改 ng bootstrap 分页组件的样式并在 Angular 6 应用程序中使用 /deep/ 链接。以下代码工作正常,但控制台显示警告,指出该代码已被弃用。 那么,我应该如何更改它以消除警
使用 webcomponents,您可以使用 /deep/ 定位 shadowdom 的内部元素,在我尝试使用事件委托(delegate)之前它工作正常。 一个常规的点击功能将起作用: $('html
在 Swift 中,我试图实现一个单词 Trie,使用文字表示作为一系列嵌套的 NSObject。这是 Trie。 let GEENITRIE:NSObject = [ "i":[
运行 npm update 更新 package.json 中列出的项目;但是,这些项目的依赖关系仍然过时。 明显的解决方法是再次运行 npm update。有时我需要运行它 3 次以上才能使 npm
我创建了 2 级嵌套 linq 查询: var data = (from p in Departments join e in Employees on p.Id equals
首先是代码 #include typedef wchar_t* BSTR; wchar_t hello[] = L"Hello"; class _bstr_t { public: opera
我要编写一个 lisp 程序来生成十六进制数的实际值。我已经编写了一个函数,但似乎出现了 stackoverflow(深度)错误。我想知道是否有人可以指出我的错误或指导我朝着正确的方向前进。 如果没有
我想将每种类型都转换为boolean 或object type CastDeep = { [P in keyof T]: K extends K[] ? K[] : T[P] ex
我刚刚发现自己在写这个: fn init_timestamps(dir: &PathBuf, file_timestamps: &'static HashMap) { match fs::re
我有一个现有的 pybind11::array_t,需要进行复制构造。 pybind11 中是否有一个函数允许我对 array_t 进行深度复制? 我知道我可以创建一个新的 array_t,适当调整大
引用http://www.devx.com/tips/Tip/13291 ,它说我可以使用 memcpy 来复制由 sizeof() 确定的大小,但是,数组不是指向指针吗? 除了遍历数组,如何使用 m
我有多个成员(member),每个成员(member)都有一条记录,其中包含几个备注字段: Member ID Entry A Entry B 1 [memo t
$watchCollection 是否能够忽略对以 $ 开头的属性的更改?使用深度 $watch 时已经存在此行为,因为它依赖于 angular.equals 进行比较。 理想情况下,$watchCo
我有一个带有复杂键的 map - 例如,二维数组: m := make(map[[2][3]int]int) 当我在映射中插入一个新键时,Go 是否会对该键进行深度复制? a := [2][3]int
我需要查询如下所述的三个表。我了解简单的 JOIN,但是这个有点超出我的水平。 courses 有两列 id (PK) 和 courseTitle(示例 id 1,courseTitle 物理) cl
我有一个对象,它是 Realm 的 Object 子类,并且符合 Codable 以便在与 API 对话时与 JSON 相互转换。 如何利用 Codable 协议(protocol)进行深度复制(包括
我是一名优秀的程序员,十分优秀!