【问题标题】:Make js object loop redundant让 js 对象循环变得多余
【发布时间】: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


【解决方案1】:

for..in 可能因输入不受信任而失败的一个例子是代理对象在其ownKeys 陷阱中做了一些令人讨厌的事情:

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


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

【讨论】:

  • 很抱歉,这有什么问题以及如何回答 OP 问题?
  • @YongQuan: OP: "...我们盲目地循环遍历 objFromUsers,所以我试图证明盲目地使用没有验证的对象会发生坏事"
猜你喜欢
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 2017-10-21
  • 2016-03-17
  • 1970-01-01
  • 2021-11-06
  • 2019-06-30
  • 2019-08-08
相关资源
最近更新 更多