如何对函数返回的对象内部的数组执行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
相关产品推荐
相关产品推荐

