无需登录 数据私有 本地保存

结构化数据代码快速检查 - 验证 JSON-LD 语法与必填属性

78
0
0
0
深拷贝 (Deep Clone)
深拷贝是指递归地复制对象的所有层级,创建一个与原始对象完全独立的新对象。新对象与原始对象之间不存在任何共享的引用关系,对新对象的任何修改都不会影响原始对象,反之亦然。深拷贝是确保数据隔离和状态管理正确性的重要手段。
浅拷贝 (Shallow Copy)
浅拷贝只复制对象的第一层属性。如果属性值是原始类型(如数字、字符串、布尔值),则拷贝的是值本身;如果属性值是引用类型(如对象、数组),则拷贝的是引用地址。这意味着修改嵌套属性会影响原始对象。常见的浅拷贝方式包括 Object.assign() 和展开运算符。
结构化克隆算法 (Structured Clone Algorithm)
结构化克隆算法是浏览器内置的一种深拷贝算法,最初用于 Web Workers 之间的消息传递。该算法支持大多数 JavaScript 数据类型,包括对象、数组、Map、Set、Date、RegExp、ArrayBuffer、Blob、File、ImageData 等。它能够正确处理循环引用,遇到不支持的类型时会抛出 DataCloneError 异常。
循环引用 (Circular Reference)
循环引用是指对象的属性直接或间接引用了自身。例如对象 A 的属性指向对象 B,而对象 B 的属性又指向对象 A。在深拷贝过程中,如果算法无法检测和处理循环引用,就会导致无限递归并最终栈溢出。structuredClone 能够通过内部的引用表机制正确处理循环引用。
structuredClone()
structuredClone() 是全局可用的函数,接收一个值作为参数并返回该值的深拷贝。它是 ES2022 正式引入的标准 API。该函数内部使用结构化克隆算法,能够处理大多数 JavaScript 数据类型和复杂的对象结构。如果传入不支持的类型,会抛出 DOMException。
JSON.parse(JSON.stringify())
这是一种经典的深拷贝技巧,通过将对象序列化为 JSON 字符串然后再解析回来实现深拷贝。这种方式的优点是兼容性极好,缺点是会丢失 undefined、Function、Symbol、Date(转为字符串)、RegExp(转为空对象)等类型的信息,且无法处理循环引用。
展开运算符 (Spread Operator)
展开运算符 ... 是 ES6 引入的语法,用于将可迭代对象展开。用于对象时如 {...obj},它会创建一个新对象并将原对象的所有顶层属性复制过去。但这是浅拷贝操作,嵌套的引用类型属性只是复制了引用,而非递归复制值。适用于简单的属性合并场景。
DataCloneError
DataCloneError 是当 structuredClone 尝试克隆不支持的数据类型时抛出的异常。例如尝试克隆 Function、DOM 节点、Error 对象等就会触发此错误。该异常包含了详细的错误信息,帮助开发者定位问题所在。
序列化 (Serialization)
序列化是指将内存中的对象转换为可以存储或传输的格式(如 JSON 字符串)的过程。反序列化则是将序列化后的格式还原为对象。JSON 方式的深拷贝本质上就是一次序列化加一次反序列化。序列化的局限在于无法保留原始对象的类型信息和方法。
引用类型 (Reference Type)
在 JavaScript 中,对象、数组、函数、Map、Set 等都是引用类型。变量存储的不是这些值本身,而是指向内存中实际数据的地址。这就是浅拷贝无法实现真正独立复制的根本原因,也是理解深拷贝必要性的关键概念。