基于模式的模拟数据生成器 - 自定义字段与规则
定义字段名称和类型(姓名、邮箱、数字范围等),批量生成符合规则的 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 模拟数据。
打开一个始终置顶的小窗口,在其中显示自定义内容(例如笔记/时钟),实验新API。
对比 ES Module 和经典脚本的变量作用域、严格模式以及执行时机。
使用Service Worker拦截fetch请求,并返回用户自定义的JSON模拟数据,用于前端独立开发。
请求用户允许读取系统剪贴板,并展示内容,显示权限状态变化。
粘贴Link rel=preload头字段,解析展示服务器计划推送的资源列表。
创建闪卡并根据掌握程度放入5个盒子,按照不同间隔自动提供今日复习卡组。
选择平台和分享参数,生成分享到Twitter、Facebook、WhatsApp等的URL链接及按钮。
设置不同验证属性和自定义消息,测试HTML5表单验证触发效果。
测试navigator.clipboard读写功能,写入文本或读取系统剪贴板,验证安全限制。
创建当用户离线时展示的简单HTML页面,结合Service Worker使用。
选择算法并随机生成数组,以彩色条动画展示排序过程,帮助理解算法。
向任意输入URL发送请求,清晰显示响应状态码、头信息和体,类似轻量级Postman。
构建或随机生成二叉树,逐步动画展示前序、中序、后序和层序遍历的路径。
逐步展示SW从注册、安装到激活的完整流程,并模拟更新与跳过等待的场景。
用彩色小球串演示Git仓库的提交(commit)、创建分支(branch)和合并(merge)过程。
枚举连接的显示器,并在特定的屏幕上打开新窗口,体验现代多显示器Web应用。
引导通过树状图分析当前担忧是假设还是现实,走向应对或放手。
输入HTML/CSS/JS特性关键词,快速查看各浏览器版本支持情况,受@mdn/browser-compat-data驱动。
通过按下键位记录code和key值,推断当前键盘布局(如QWERTY、AZERTY)。
在单页内模拟MPA过渡效果,自定义进场/出场动画,体验View Transitions API丝滑切换。
常用HTML实体编码(如© ©)的图形化速查表,点击即可复制实体名称或数字代码。
预置多种常见表单(登录、联系、搜索)的HTML代码,点击即可复制并稍作修改。
构建二叉树节点,动态演示三种深度优先遍历顺序及逐层遍历。
在散点图上拖拽数据点,实时更新最小二乘回归线,显示斜率和截距。
输入当前扫雷局面数字,工具尝试用逻辑推断安全的格子或必定是雷的格子。
以JSON或可视化方式编写分支剧情,生成可在浏览器游玩的文字冒险游戏。
交互式探索Julia集,实时调整复数参数c,支持平滑着色和鼠标缩放,感受分形之美。
展示各种 HTML5 验证属性(required, pattern, min, max 等)和自定义验证消息的效果。
使用原生HTML Popover属性创建提示、菜单与对话框,展示四种触发方式及样式定制。