You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript的structuredClone并非真正深拷贝?共享引用问题解析

JavaScript structuredClone 方法的深拷贝意外行为

排查应用Bug时发现JavaScript的structuredClone方法存在意外行为。该方法宣称可创建值的深拷贝,此前我们通过JSON.parse(JSON.stringify(value))实现深拷贝,理论上structuredClone是该方法的超集——既能得到相同结果,还支持Date类型和循环引用。但实际测试发现,当克隆包含指向同一引用的引用类型变量的对象时,structuredClone会保留这些引用,而非创建新的独立引用。

以下是演示该行为的示例代码:

const someSharedArray = ['foo', 'bar']

const myObj = {
  field1: someSharedArray,
  field2: someSharedArray,
  field3: someSharedArray,
}

const myObjCloned = structuredClone(myObj)

console.log(myObjCloned)
/**
{
    "field1": ["foo", "bar"],
    "field2": ["foo", "bar"],
    "field3": ["foo", "bar"],
}
**/

myObjCloned.field2[1] = 'baz'

// 此时:
// 预期:仅`field2`的值应改变,因为`myObjCloned`是深拷贝得到的。
// 实际:所有字段的值都改变了,因为它们仍指向同一数组引用

console.log(myObjCloned)
/**
{
    "field1": ["foo", "baz"],
    "field2": ["foo", "baz"],
    "field3": ["foo", "baz"],
}
**/

这种行为令人意外,原因如下:

  • 该方法宣称执行深拷贝
  • 使用JSON.parse(JSON.stringify(value))时不会出现此行为

内容的提问来源于stack exchange,提问作者Liran H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 08:53:21