前端开发中容易被忽略的 structuredClone()

举报
yd_284498617 发表于 2026/11/05 17:06:32 2026/11/05
【摘要】 在 JavaScript 开发中,经常需要复制对象。最常见的方式是使用展开运算符,但它只能实现浅拷贝。当对象存在多层嵌套时,修改副本可能会影响原对象。这时候可以使用原生提供的 structuredClone()。 1. 浅拷贝的问题const original = { name: 'Tom', profile: { age: 20 }}const copy = { ...orig...

在 JavaScript 开发中,经常需要复制对象。

最常见的方式是使用展开运算符,但它只能实现浅拷贝。当对象存在多层嵌套时,修改副本可能会影响原对象。

这时候可以使用原生提供的 structuredClone()。

1. 浅拷贝的问题

const original = {
  name: 'Tom',
  profile: {
    age: 20
  }
}

const copy = { ...original }

copy.profile.age = 30

console.log(original.profile.age) // 30

因为展开运算符只复制第一层属性,嵌套对象仍然共享引用。

2. 使用 structuredClone()

const original = {
  name: 'Tom',
  profile: {
    age: 20
  }
}

const copy = structuredClone(original)

copy.profile.age = 30

console.log(original.profile.age) // 20

structuredClone() 可以实现真正的深拷贝,不需要手动递归处理嵌套对象。

3. 支持循环引用

传统的 JSON 序列化方式无法处理循环引用:

const obj = {
  name: 'Tom'
}

obj.self = obj

// 会抛出异常
JSON.stringify(obj)

而 structuredClone() 可以正常处理:

const copy = structuredClone(obj)

console.log(copy.self === copy) // true

4. 注意事项

structuredClone() 并不是万能的深拷贝方案。

它支持:

  • 普通对象和数组
  • Date
  • Map 和 Set
  • ArrayBuffer
  • 循环引用

但不支持:

  • 函数
  • Symbol 值
  • DOM 节点
  • WeakMap 和 WeakSet

此外,普通对象的原型链和属性描述符不会被完整保留。

总结

structuredClone() 是现代 JavaScript 中非常实用的深拷贝工具。

相比 JSON.parse(JSON.stringify()),它支持更多数据类型,也能正确处理循环引用。

在处理表单数据、复杂配置对象以及状态副本时,可以优先考虑使用它。

不过,如果只是简单对象的浅拷贝,展开运算符依然是更轻量的选择。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。