在ES6中保护......的正确方法

时间:2017-08-06 14:49:02

标签: javascript for-loop ecmascript-6

保护ES6用于循环的最佳方法是什么?

for (let bar of foo.bars) {
  baz = await quix(bar)
}

如果栏未定义怎么办?它抛出

  

TypeError:undefined不可迭代!

一个简单的

if (foo.bars) {
  // ..
}

是这样做的吗?

3 个答案:

答案 0 :(得分:3)

是的,请确保以某种方式在循环之前未定义foo.bars。如何做到这一点取决于你的实际使用情况。

如果你的对象中有某种可以为空的字段,if测试确实是最干净的方法。一个不那么明显的替代方法是将空集合作为默认值进行迭代:

for (let bar of foo.bars || []) {
  baz = await quix(bar)
}

但是,最佳做法可能是have the empty collection instead of null(或undefined)作为属性值。

答案 1 :(得分:0)

如果你想更安全

if (foo && "bars" in foo) {...}

答案 2 :(得分:0)

for/of循环开始时防止可能导致异常的任何可能数据的完整防范必须测试三件事:

  1. foo存在
  2. foo.bar存在
  3. foo.bar可迭代
  4. 没有超级干净的方法来测试这三种方法:

    if (foo && foo.bar && typeof foo.bar[Symbol.iterator] === "function") {
        for (let bar of foo.bar) {
            baz = await quix(bar);
        }
    }
    

    有关测试的更多信息,以查看某些内容是否可迭代:What is the technical definition of a Javascript iterable and how do you test for it?

    当然,您可以使用try / catch来捕获任何异常,而不是预先测试它(无论如何,您可能需要处理await中的拒绝。)