
axios返回的api响应数据在控制台打印时出现数组截断(如本应有2项却只显示1项),通常并非网络请求或axios本身的问题,而是因代码中对响应对象进行了原地修改(如splice、push、赋值等),导致后续日志输出反映的是已被篡改后的状态。
axios返回的api响应数据在控制台打印时出现数组截断(如本应有2项却只显示1项),通常并非网络请求或axios本身的问题,而是因代码中对响应对象进行了原地修改(如splice、push、赋值等),导致后续日志输出反映的是已被篡改后的状态。
这是一个典型的JavaScript对象引用陷阱。Axios 的 response.data 是一个普通 JavaScript 对象(或嵌套对象),其内部属性(如 attributes.innerAttributes.fundamentals.base)是数组引用。当你执行类似 response.data.attributes.innerAttributes.fundamentals.base.splice(1, 1) 或任何直接修改该数组的方法时,你并非在操作副本,而是在修改原始响应对象的内存引用——这意味着后续 console.info("from API", response.data) 打印的已是被污染后的状态。
例如,以下代码会引发问题:
const response = await this.axiosInstance.get("my-ledger-endpoint/ledger-XXXXX");
// ❌ 危险:直接突变响应数据
response.data.attributes.innerAttributes.fundamentals.base.splice(1); // 删除第二项
console.info("from API", response.data); // 此时 base 只剩 ["sample-base-1"]✅ 正确做法是始终将响应数据视为不可变(immutable),需深拷贝或结构化克隆后再处理:
const response = await this.axiosInstance.get("my-ledger-endpoint/ledger-XXXXX");
// ✅ 安全:创建独立副本再操作
const safeData = JSON.parse(JSON.stringify(response.data));
// 或使用现代语法(支持嵌套对象/数组,但不支持函数、Date、undefined 等)
// const safeData = structuredClone(response.data);
// 现在可安全修改副本
safeData.attributes.innerAttributes.fundamentals.base.splice(1);
console.info("original API response", response.data); // 保持完整,含两项
console.info("modified copy", safeData); // 修改仅影响副本⚠️ 注意事项:
- console.log() / console.info() 在 Chrome/Firefox 中显示的是实时对象快照(即展开查看时读取当前值),而非调用时刻的冻结快照。因此若你在 console.info() 之前修改了响应对象,日志中看到的就是修改后的结果。
- 避免在拦截器(interceptors)、工具函数或业务逻辑中对 response.data 直接调用 push()、pop()、splice()、sort()、reverse() 或赋值(如 data.arr = [...])等突变操作。
- 若需统一预处理响应,应在 axios 响应拦截器中返回新对象,而非修改 config 或 response.data 原始引用。
总结:Axios 本身不会“丢数据”,它忠实地传递服务端返回的完整 payload。所谓“缺失值”,实为开发过程中无意间触发的引用型副作用。养成「响应数据只读」习惯,并借助 structuredClone()(推荐)或 JSON.parse(JSON.stringify())(兼容性好,但有局限)进行安全复制,是避免此类隐蔽 Bug 的关键实践。


















