Javascript 保护…的正确方法。。。在ES6中的应用
为…保护ES6的最佳方式是什么。。。环的Javascript 保护…的正确方法。。。在ES6中的应用,javascript,for-loop,ecmascript-6,Javascript,For Loop,Ecmascript 6,为…保护ES6的最佳方式是什么。。。环的 for (let bar of foo.bars) { baz = await quix(bar) } 如果条未定义怎么办?它抛出 TypeError:未定义不可修改 简单的 if (foo.bars) { // .. } 有什么办法吗?如果你想更安全的话 if (foo && "bars" in foo) {...} 是的,以某种方式确保在循环之前未定义foo.bar。当然,如何做到这一点取决于您的实际用例 如果对象中有某
for (let bar of foo.bars) {
baz = await quix(bar)
}
如果条未定义怎么办?它抛出
TypeError:未定义不可修改
简单的
if (foo.bars) {
// ..
}
有什么办法吗?如果你想更安全的话
if (foo && "bars" in foo) {...}
是的,以某种方式确保在循环之前未定义
foo.bar
。当然,如何做到这一点取决于您的实际用例
如果对象中有某种类型的可空字段,那么If
测试确实是最干净的方法。另一个不太明显的选择是将空集合作为默认值进行迭代:
for (let bar of foo.bars || []) {
baz = await quix(bar)
}
但是,最好的做法可能是立即将(或
未定义的)作为属性值。一个完整的保护,以防止任何可能在for/of
循环开始时导致异常的数据,必须测试三件事:
存在foo
存在foo.bar
那foo.bar
是可编辑的
没有一种超级干净的方法来测试这三种:
if (foo && foo.bar && typeof foo.bar[Symbol.iterator] === "function") {
for (let bar of foo.bar) {
baz = await quix(bar);
}
}
有关测试的更多信息,请参见:
当然,您可以使用try/catch来捕获任何异常,而不是对其进行预测试(您可能需要在wait
中处理拒绝)。为什么bar
是未定义的?我认为您的两个问题没有关系。例如,如果尝试在
中对未定义的值使用For…进行迭代,也会引发错误。不向语句或声明提供实际值可能会产生意外结果。根据您的情况,您可能希望防止foo.bar
超过未定义的。它也可能是不可iterable的,并且会抛出。问题是关于…如果不是一个更完整的防护,需要看看foo.bar
是否实际上是可引用的,因为您的解决方案为仍然会抛出的foo.bar
留下了很多值。@jfriend00,正如我所说的,它总是取决于用例-在一个好的程序中,你知道它在什么时候可能有什么值:-),所以最完整的保护将是try{for(let bar of foo.bar){…}catch(e){…}
,这取决于数据来自何处。如果您是一个外国程序员正在使用的接口,那么您不知道可能的值是什么,显式测试将允许您提供更好的错误,而不仅仅是让它抛出一些令人困惑的错误。是的,我知道iterable测试,因为这是对我自己问题的回答。似乎值得补充的是,作为一个选项,我们可以在这里做出更好的回答。@jfriend00这个问题只问了“未定义”,我认为答案的第一段、我们在这里的讨论以及到您的问题的链接可以很好地处理其余的问题