问题标签 [structured-clone]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1498 浏览

javascript - 如何检查对象是否可以通过结构化克隆算法进行克隆

结构化克隆算法是一种序列化算法,除其他外,用于通过window.postMessage. 它支持递归对象(与 JSON 不同),但不支持 DOM 节点、函数和错误等

我想要的是一种简单的方法来检查给定对象是否可以通过结构化克隆算法进行序列化。我可以递归地遍历对象并检查每个属性是 DOM 节点、函数还是错误,但这不是一个完整的答案,我想知道是否有更好的方法。

0 投票
1 回答
327 浏览

request - 结构化克隆 Fetch API 请求对象的最佳选择是什么?

我正在尝试存储受 CSRF 保护的(查询字符串 + cookie)API POST 请求,以便稍后在 web 应用重新联机时重播。

为此,我想将请求对象(Fetch API)保存在 IndexedDB 中,但 IDBObjectStore.put 失败并出现 DataCloneError “无法克隆对象”。

Request 对象有一个简单的 JSON 主体,没有二进制数据,只有字符串。
这是在服务工作者(网络工作者)环境中运行的。

结构化克隆算法不会克隆请求对象有什么原因吗?[回答: 是] 如果是这样,我最好的选择是脱水/再水化这个对象来代替结构化克隆?

我真的想避免必须知道/访问 Request 对象的各个属性。我需要的请求部分是 url、标头、正文和 cookie(但同样,我不希望代码必须知道这些)。

提前感谢您的任何建议。

0 投票
1 回答
146 浏览

javascript - 结构化克隆 - 克隆哪个线程?

我在 WebWorker 上做了一些工作。当我将对象发布回我的 GUI 线程时,Javascript 引擎使用结构化克隆算法来克隆对象,GUI 线程接收克隆的对象。

我的问题是,克隆工作在哪里完成,在发送者(WebWorker)、接收者(GUI 线程)上,还是我完全搞错了?

0 投票
0 回答
16 浏览

javascript - 更新现有对象的最有效方法(使用类似的对象)

怎么了伙计们,我对原子有疑问,这就是我所处的位置:我需要找到“用另一个对象更改一个对象的最有效方法。

假设我有 object1 和我有 object2 它们都是相同的,因为它们共享相同的 Id 、 name .....ect 但假设 object 已弃用并且 object2 是从 server 或 database 读取的。

会不会 A:使用 Object.assign() 进行深度克隆会更便宜。

A.1:使用抓取的对象替换已经存在的对象 (a=b) 。

B:遍历object2的可枚举属性(obj1.propA = obj2.propA)。

我想知道处理数千个对象的最有效方法是什么。我通常会尽量避免循环,绝对是双循环。

我已经尝试过这里的代码并且它可以工作,但我对它是否是最有效的模型一无所知。

0 投票
1 回答
240 浏览

javascript - 如何告诉 postMessage 结构化克隆忽略属性?

我正在做一个项目,我需要在 iframe 中创建一个对象,然后将所述对象发送到父窗口。

问题是postMessage失败,因为对象不能被克隆 ( DataCloneError),因为它具有函数 ( callback) 属性。

更复杂的是,存在一种循环关系,其中按钮列表包含按钮,并且每个按钮都有对其父列表的引用。

如果这是使用JSON.stringify而不是结构化克隆,则可以覆盖toJSON按钮并避免发送callback并替换listlistId以避免循环引用情况。是否有等效于结构化克隆的方法,可以在保持循环关系的同时toJSON允许忽略,或者其他解决方案?callback

这是可重现错误的情况的粗略要点:

父窗口不需要知道回调,但需要知道任何其他属性。

0 投票
1 回答
44 浏览

javascript - 传递给网络工作者时,文件实例上的自定义属性未克隆

根据 MDN,File可以将对象传递给 Web Workers,并使用结构化克隆算法正确克隆它们。到目前为止,一切都很好。这适用于我测试过的所有浏览器:

但这不起作用:

奇怪的是,这个作品:

这发生在 Chrome、Firefox 等的最新版本中,所以我认为这不是浏览器问题。

选项:

  1. 我做错了什么,这导致克隆对象时该属性丢失。
  2. 当克隆预定义对象(如文件)而不是我创建的对象时,我添加的所有自定义属性都会丢失,因为浏览器会忽略非标准对象属性。
  3. 我不理解规范,很明显,在将对象传递给 Web Worker 时不会克隆自定义属性。

我在这里做错了吗?提前致谢 ;))

0 投票
0 回答
23 浏览

typescript - 存储在浏览器的 IndexedDB 中的对象必须是“可序列化对象”——Typescript 接口可用吗?

IDBObjectStore.put()上的 MDN 页面说,如果可以创建“结构化克隆”并且该术语引用whatwg.org上的可序列化对象,则可以存储对象。

对于打字稿 api,我想要求一个对象是可序列化的,例如考虑

然而似乎没有这样的接口或类型可用。除了编写文档注释之外,有没有办法让编译器帮助 api 的用户不传递不可序列化的对象?

0 投票
2 回答
64 浏览

javascript - 如何在保持原始响应数据结构不可变的同时将数据项附加到深层嵌套数组?

我每天都在创建数据,并且正在处理以下响应数据......

tipster.picks数组中,我需要data在最后一个匹配项上附加一个附加data项。匹配可能是 where data.titleequals "today"

到目前为止我想出的代码并没有导致正确的结果......

我正在使用扩展运算符,因为我需要维护旧数据并且只在数据数组上添加一个新对象。

我真的很感谢这里的一点帮助。谢谢你。