【发布时间】:2018-09-14 01:29:12
【问题描述】:
我是一个 JS api 的测试人员。用户将直接调用我们的方法。
例子:
function funcWeGiveToUser(objFromUsers){
// here we will loop over user provided object
}
开发人员编写funcWeGiveToUser 的方式是我们盲目地循环objFromUsers,所以我试图证明盲目地使用没有验证的对象会发生坏事。
现在我想看看,通过提供一个包含 getter 的 objFromUsers,我是否可以以某种方式破坏代码(我已经通过它访问了私有数据,耶!)。 p>
我想要的是让对象永远改变,这样当我们的 API 循环它时,它就会是多余的 - 但我无法实现。
我试过写这样一个对象:
var objFromUsers = {
get addNewOne(){
this.counter = this.counter || 1;
this["element"+ (this.counter++)] = "some value";
return 2;
}
}
但如果我自己循环,结果如下:
for (el in objFromUsers) console.log(el+": "+objFromUsers[el]);
// addNewOne: 2
console.log(objFromUsers)
// {counter: 2, element1: "some value"}
再次循环,我确实得到了之前添加的元素:
for (el in objFromUsers) console.log(el+": "+objFromUsers[el]);
// addNewOne: 2
// counter: 3
// element1: some value
console.log(objFromUsers)
// {counter: 3, element1: "some value", element2: "some value"}
但是,我实际上希望循环将永远看到一个新键,因此它会不断迭代。有没有可能做这种循环冗余?
【问题讨论】:
-
您要删除之前添加的密钥吗?
-
好吧,我一直在考虑不断添加新键,但您提出了一个有趣的测试用例。我会考虑它如何应用于这个 API。但回到这个问题的上下文,你认为有可能添加新键并同时循环遍历新键吗?
-
你能详细说明一下也循环遍历新的吗?您还想增加以前添加的属性的值吗?
-
这是一个有趣的问题,因为这应该会导致无限循环,但它不会。 Mozilla JS Docs 声明“添加到发生迭代的对象的属性可以在迭代中访问或省略。”
-
您最好将管理库的整个想法抽象出来并提出以下问题:“如何使用
for语句在 JavaScript 中创建无限循环”
标签: javascript getter-setter getter