基于模式的模拟数据生成器 - 自定义字段与规则
定义字段名称和类型(姓名、邮箱、数字范围等),批量生成符合规则的 JSON 模拟数据。
UD5工具箱
深入理解 structuredClone() 的深拷贝能力 —— 对比 JSON 序列化,直观查看支持与不支持的数据类型
| 数据类型 | structuredClone | JSON 序列化 | 备注 |
|---|---|---|---|
String / Number / Boolean |
支持 | 支持 | 基本类型,两者均完美支持 |
null / undefined |
支持 | 部分 | JSON 不支持 undefined(属性会被移除) |
Object / Array |
支持 | 支持 | 嵌套对象和数组均支持 |
Date |
支持 | 丢失类型 | JSON 将其转为字符串,丢失 Date 类型 |
RegExp |
支持 | 丢失类型 | JSON 将其转为空对象 {} |
Map |
支持 | 丢失类型 | JSON 将其转为空对象 {} |
Set |
支持 | 丢失类型 | JSON 将其转为空对象 {} |
ArrayBuffer / TypedArray |
支持 | 丢失类型 | JSON 将其转为空对象或普通对象 |
Blob / File |
支持 | 不支持 | JSON 完全无法处理二进制数据 |
循环引用 |
支持 | 抛出错误 | structuredClone 的核心优势 |
Function |
抛出错误 | 忽略/错误 | 两者均不支持克隆函数 |
Symbol |
抛出错误 | 忽略 | Symbol 无法被克隆 |
DOM 节点 |
抛出错误 | 不支持 | DOM 节点不可转移 |
WeakMap / WeakSet |
不支持 | 不支持 | 弱引用集合不可克隆 |
// 基本用法
const original = { name: 'Alice', data: new Map([['key', 42]]) };
const clone = structuredClone(original);
// 深拷贝验证:修改克隆不影响原对象
clone.name = 'Bob';
console.log(original.name); // 'Alice' — 未受影响 ✓
// 循环引用也能正确处理
original.self = original;
const clone2 = structuredClone(original); // 成功!JSON 会报错
// 不支持函数——会抛出 DOMException
try {
structuredClone({ fn: function() {} });
} catch (e) {
console.error(e.name); // 'DataCloneError'
}
structuredClone() 是 JavaScript 的原生全局函数,用于执行深拷贝(deep clone)操作。它基于浏览器的结构化克隆算法,最初为 Web Workers 的消息传递设计,现已公开为通用 API。
相比于 JSON.parse(JSON.stringify()),它能处理更多数据类型(如 Date、Map、Set、RegExp、ArrayBuffer、循环引用等),是现代前端开发中推荐的深拷贝方案。
核心区别:
TypeError。undefined 值;JSON 会移除 undefined 属性。DataCloneError。简单来说:structuredClone 是更强大、更可靠的深拷贝方案。
完全支持:
不支持:Function、Symbol、DOM 节点、WeakMap、WeakSet、Proxy、Error 对象的 stack 属性等。
查看上方对照表获取完整列表。
函数(Function)包含可执行代码和闭包上下文,无法被安全地序列化和反序列化。结构化克隆算法在底层使用二进制序列化,无法捕获函数的执行逻辑和词法环境。
如果需要传递行为,建议使用策略模式、配置对象或消息传递来替代直接克隆函数。如果确实需要深拷贝包含函数的对象,可以结合使用 structuredClone 和手动赋值函数属性。
可以!这是 structuredClone 相比 JSON 序列化的一个重要优势。结构化克隆算法内部维护了一个对象映射表,能够检测并正确处理循环引用,而不会陷入无限递归。
在上方演示中选择"循环引用"预设,即可直观看到 structuredClone 成功处理自引用对象,而 JSON 序列化会直接报错。
structuredClone() 在现代浏览器中得到广泛支持:
--experimental-global-structured-clone 标志),Node.js 18+ 默认支持对于旧浏览器,可以使用 polyfill 或回退到 JSON.parse(JSON.stringify())(注意局限性)。
lastIndex 会被重置为 0。message),stack 可能不完整。建议在使用前先测试目标对象是否包含不支持的类型,做好错误处理。
Node.js 18+ 版本已原生支持 structuredClone() 作为全局函数,无需任何额外配置。
Node.js 17 需要启动标志:node --experimental-global-structured-clone index.js
对于更早的 Node.js 版本,可以使用 v8 模块的序列化 API,或安装 @ungap/structured-clone polyfill。
示例:const clone = structuredClone(complexObject); — 用法与浏览器完全一致。
定义字段名称和类型(姓名、邮箱、数字范围等),批量生成符合规则的 JSON 模拟数据。
输入一组快捷键,检测在主流操作系统和浏览器中是否已被系统或软件占用。
向指定 URL 发送不同 HTTP 方法的请求,显示响应状态码、头部和主体,学习 RESTful API。
打开一个始终置顶的小窗口,在其中显示自定义内容(例如笔记/时钟),实验新API。
捕捉页面粘贴事件,展示文本、HTML 或图片数据,演示如何定制粘贴行为。
通过实例展示原生拖放 API 的使用,包括文件拖拽上传和页面元素排序功能。
对比 ES Module 和经典脚本的变量作用域、严格模式以及执行时机。
可视化线段树的构建、单点更新和区间求和查询过程,理解树状结构。
根据输入的外部域名,生成 dns-prefetch、preconnect 和 preload 标签。
使用Service Worker拦截fetch请求,并返回用户自定义的JSON模拟数据,用于前端独立开发。
请求用户允许读取系统剪贴板,并展示内容,显示权限状态变化。
使用 ImageCapture.takePhoto() 拍摄高分辨率照片,或抓取实时帧并下载。
配置事件类型和重试间隔,生成用于接收 SSE 的前端 EventSource 代码和后端流示例。
粘贴Link rel=preload头字段,解析展示服务器计划推送的资源列表。
创建闪卡并根据掌握程度放入5个盒子,按照不同间隔自动提供今日复习卡组。
根据分支类型(feature/bugfix/hotfix)和描述自动生成规范的分支名,如 feature/xxx。
选择平台和分享参数,生成分享到Twitter、Facebook、WhatsApp等的URL链接及按钮。
设置不同验证属性和自定义消息,测试HTML5表单验证触发效果。
测试navigator.clipboard读写功能,写入文本或读取系统剪贴板,验证安全限制。
创建当用户离线时展示的简单HTML页面,结合Service Worker使用。
选择算法并随机生成数组,以彩色条动画展示排序过程,帮助理解算法。
模拟多层代理逐步添加 X-Forwarded-For 头的过程,理解如何获取真实客户端 IP。
选择扩展类型(弹出、内容脚本、后台),生成完整的项目文件和 manifest.json。
向任意输入URL发送请求,清晰显示响应状态码、头信息和体,类似轻量级Postman。
输入问题描述(如“禁止未使用变量”),自动匹配对应的 ESLint 规则名称及配置建议。
构建或随机生成二叉树,逐步动画展示前序、中序、后序和层序遍历的路径。
勾选需要临时禁用的 ESLint 规则,生成对应的 /* eslint-disable */ 注释语句。
逐步展示SW从注册、安装到激活的完整流程,并模拟更新与跳过等待的场景。
用彩色小球串演示Git仓库的提交(commit)、创建分支(branch)和合并(merge)过程。
枚举连接的显示器,并在特定的屏幕上打开新窗口,体验现代多显示器Web应用。