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

Lodash cloneDeep与Fetch API Response.clone()的差异对比

response.clone() vs Lodash cloneDeep(response):Response对象克隆的核心区别

嘿,这个问题我太熟悉了!之前帮不少开发者捋过Fetch API里Response对象克隆的坑,正好给你掰扯清楚这两种克隆方式的本质差异:

一、response.clone():为Response量身定制的原生方案

  • 专门适配流对象:Response的核心是它的body——一个只读且只能被消费一次的流。比如你调用response.json()后,这个流就被耗尽了,原Response再也没法读取body内容。clone()是Fetch API原生提供的方法,就是为了解决这个痛点:它会创建一个和原Response完全一致的副本,并且拥有独立的可消费流,让你能多次处理Response的body。
  • 保留原生身份与功能:克隆出来的对象还是正经的Response实例,继承了所有原生方法(json()、text()、blob()等)和行为,和原Response的使用方式完全一样,没有任何违和感。

二、Lodash cloneDeep(response):通用方案在特殊对象上的失效

  • 无法处理流结构:cloneDeep是针对普通JS对象/数组设计的深克隆工具,它只会递归复制对象的可枚举属性。但Response的body流是内部隐藏的特殊结构,不属于可枚举属性,所以cloneDeep根本复制不了流内容。
  • 克隆出的不是真正的Response:最终得到的只是一个“长得像”Response的普通JS对象,没有Response的原型链,也就没有json()这类核心方法。就算你拿到这个克隆对象,也没法用它来读取body内容。
  • 可能引发异常:Response内部包含很多浏览器绑定的隐藏状态,cloneDeep深克隆时可能会误复制这些内部状态,导致克隆对象行为诡异,甚至抛出莫名其妙的错误。

举个直观的代码对比

// ✅ 正确用法:用clone()复用Response
fetch('https://example.com/data')
  .then(response => {
    const clonedResponse = response.clone();
    // 原Response处理一次body
    response.json().then(data => console.log('原Response数据:', data));
    // 克隆的Response还能再处理一次
    clonedResponse.json().then(data => console.log('克隆Response数据:', data));
  });

// ❌ 错误用法:用cloneDeep克隆Response
fetch('https://example.com/data')
  .then(response => {
    const fakeResponse = _.cloneDeep(response);
    // 原Response消费流后,fakeResponse的body已经没用了
    response.json().then(data => console.log('原Response数据:', data));
    // 这里会直接报错:fakeResponse.json is not a function
    fakeResponse.json().catch(err => console.log('克隆对象调用失败:', err));
  });

总结

如果你的需求是复用Response的body流,别犹豫,直接用response.clone()——这是官方为这类特殊对象量身打造的解决方案。而Lodash的cloneDeep只适合普通JS对象,对Response、Request这类浏览器原生API对象完全不适用。

内容的提问来源于stack exchange,提问作者Eranga Heshan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:07:35