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

如何对函数返回的对象内部的数组执行push操作?

如何对函数返回的对象内部的数组执行push操作?

我明白你的困扰啦!先给你拆解一下问题出在哪,再给你几个贴合你测试场景的解决办法~

问题根源

你现在每次调用stuff()的时候,函数都会重新创建一个全新的对象返回给你。举个例子:

  • 第一次stuff().five.push("honey")确实给那个临时生成的对象里的数组加了元素,但这个临时对象用完就被浏览器/JS引擎回收了;
  • 第二次调用stuff()时,函数又从头生成了一个完全新的对象,里面的five数组还是初始的["blue", "cat", "train"],自然看不到你刚才加的"honey"。

而第一个arr是全局的固定对象,所有操作都针对同一个对象,所以修改能保留下来。

解决方案(适配你的测试场景)

你提到不能用全局变量,因为测试会复用旧的全局状态,那这几个方法很适合你:

1. 单次测试内用局部变量保存对象(最推荐)

在每个测试的代码块里,把函数返回的对象存在局部变量里,之后的修改和读取都针对这个局部变量:

// 单个测试的代码块内(非全局)
const currentTestObj = stuff();
currentTestObj.five.push("honey");
console.log(currentTestObj.five); // 输出:["blue", "cat", "train", "honey"]

每个测试的currentTestObj都是当前测试的局部变量,不会和其他测试的变量互相干扰,完美满足你的需求。

2. 用闭包缓存对象(适合需要复用同一对象的场景)

如果你的测试需要多次调用stuff()但都操作同一个对象,可以把对象存在函数的闭包里,只初始化一次:

function stuff() {
  // 闭包变量,只在第一次调用时初始化
  const cachedObj = {
    one : "tree",
    two : "apple",
    three : 45,
    four : "red",
    five : ["blue", "cat", "train"],
  };
  // 重写函数,之后每次调用直接返回缓存的对象
  stuff = () => cachedObj;
  return cachedObj;
}

// 使用
stuff().five.push("honey");
console.log(stuff().five); // 输出修改后的数组

注意:这个方法会让stuff()每次返回同一个对象,如果你的测试需要每次都是全新对象,就别用这个。

3. 让函数支持传入修改逻辑

可以给stuff()加一个参数,允许你传入修改函数,在对象生成后直接修改它:

function stuff(alterFn) {
  const obj = {
    one : "tree",
    two : "apple",
    three : 45,
    four : "red",
    five : ["blue", "cat", "train"],
  };
  // 如果传入了修改函数,就执行它
  if (typeof alterFn === 'function') {
    alterFn(obj);
  }
  return obj;
}

// 使用
const modifiedObj = stuff(obj => {
  obj.five.push("honey");
});
console.log(modifiedObj.five); // 输出修改后的数组

这种方式每次调用stuff()还是生成新对象,但能直接拿到修改后的版本,也不会污染全局。

备注:内容来源于stack exchange,提问作者Issac Alleyne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:49:31