我是JS api的测试人员。用户将直接调用我们的方法。
示例:
function funcWeGiveToUser(objFromUsers){
// here we will loop over user provided object
}
开发人员以funcWeGiveToUser
的方式写了objFromUsers
,我们盲目地循环objFromUsers
,所以我试图通过盲目地使用没有验证错误的对象来证明事情会发生。
现在我想通过提供包含getter的var objFromUsers = {
get addNewOne(){
this.counter = this.counter || 1;
this["element"+ (this.counter++)] = "some value";
return 2;
}
}
来查看是否可以以某种方式破坏代码(我已经通过此访问私有数据,是的!)
我想要的是让对象永远改变,这样当我们的API遍历它时,它就会多余 - 但我无法实现这一点。
我尝试写这样一个对象:
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"}
再次循环我确实得到了之前添加的元素:
NSUbiquitousKeyValueStore
但是,我实际上希望循环会永远看到一个新密钥,因此它会继续迭代。是否有可能实现这种循环冗余?
答案 0 :(得分:1)
for..in
如何通过不受信任的输入失败的一个示例是一个代理对象,它在ownKeys
陷阱中做了一些讨厌的事情:
evil = new Proxy({}, {
ownKeys() {
console.log('got ya');
return [];
}
});
for(x in evil) {
console.log(x)
}