使js对象循环冗余

时间:2018-04-04 13:02:58

标签: javascript getter-setter getter

我是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

但是,我实际上希望循环会永远看到一个新密钥,因此它会继续迭代。是否有可能实现这种循环冗余?

1 个答案:

答案 0 :(得分:1)

for..in如何通过不受信任的输入失败的一个示例是一个代理对象,它在ownKeys陷阱中做了一些讨厌的事情:

evil = new Proxy({}, {
    ownKeys() {
        console.log('got ya');
        return [];
    }
});


for(x in evil) {
    console.log(x)
}