跨上下文传递JSON.parse生成数组报错,已试Array.from仍未解决
跨上下文数组传递错误的解决办法
问题根源
这个错误出在你要传的数组(或者数组里的元素)属于另一个JS执行上下文——比如iframe、Web Worker、浏览器扩展的隔离环境。不同上下文里的对象是完全隔离的,就算结构一模一样,也没法直接跨边界传递。你用Array.from没用,是因为它只复制了数组外壳,里面的元素还是原上下文的DynamicObject实例,照样会触发隔离限制。
有效解决方法
1. 彻底序列化再解析
把原数组转成JSON字符串,到目标上下文再重新解析,这样所有对象都会变成当前环境的原生对象,彻底切断和原上下文的关联:
// 原上下文(数组来源处) const originalArray = JSON.parse(yourJsonString); const serializedStr = JSON.stringify(originalArray); // 目标上下文(要传递到的地方) const targetArray = JSON.parse(serializedStr);
这种方法最通用,只要数组里的元素都是JSON支持的类型(字符串、数字、普通对象、数组这些)都能用。
2. 手动深度克隆
如果数组里有JSON搞不定的类型(比如Date、函数),就自己写个递归方法,把每个元素都克隆成当前上下文的对象:
function deepClone(obj) { if (obj == null || typeof obj !== 'object') return obj; // 处理数组 if (Array.isArray(obj)) { return obj.map(item => deepClone(item)); } // 处理对象 const clonedObj = {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { clonedObj[key] = deepClone(obj[key]); } } return clonedObj; } // 使用方式 const targetArray = deepClone(originalArray);
要是有特殊类型,比如Date,就得单独处理:克隆的时候转成ISO字符串,到目标上下文再转成Date对象。
3. 用postMessage合规传递(针对iframe/Worker场景)
如果是在iframe和主窗口、或者Worker之间传数据,优先用postMessage,但要确保传的是结构化克隆支持的类型。要是有不支持的类型,还是先序列化:
// 主窗口给iframe发数据 iframe.contentWindow.postMessage(JSON.stringify(originalArray), '*'); // iframe接收数据 window.addEventListener('message', (e) => { const targetArray = JSON.parse(e.data); });
内容的提问来源于stack exchange,提问作者Tich Zvidzayi
相关产品推荐
相关产品推荐

