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
相关产品推荐
相关产品推荐

