【发布时间】:2014-11-28 19:22:02
【问题描述】:
我最近使用 Swift 进行了很多编程。今天,当我遇到问题时,我在 JavaScipt 中做了一些工作:
在 JavaScript 中有没有类似于可选链的东西?没有任何变量来防止undefined is not an object 的方法?
例子:
function test(){
if(new Date() % 2){
return {value: function(){/*code*/}};
}
}
test().value();
会失败一半,因为有时test 返回未定义。
我能想到的唯一解决方案是函数:
function oc(object, key){
if(object){
return object[key]();
}
}
oc(test(), 'value');
我希望能够做类似的事情:
test()?.value()
问号后面的部分只有在test返回一个对象时才会执行。
但这不是很优雅。有更好的吗?运算符的神奇组合?
编辑我知道我可以重写test 来返回一些东西。但我想知道是否有类似可选链接的东西。我对上述示例的特定解决方案不感兴趣。如果无法控制返回未定义的函数,我也可以使用。
【问题讨论】:
-
test() 返回 undefined 时你希望 value() 返回什么?
-
@ZaheerAhmed 错误或未定义。真的没关系。
-
可以在未定义的情况下包装现有函数返回一个默认值,无需重写。您还可以在调用时使用三元 (x?y:z)() 或默认运算符 (x||y)()。
-
我在想你可以对每个你想要默认的包装器使用相同的包装器,即使只是一组函数名和一个 map(),但也许我不明白目标.函数在 JS 中很容易出错,所以它不应该采用重复或样板。 RE:编辑,“(x=test()) && x.value()” 比包装器短,或者如果你有时返回一个真值而不是一个对象, (x=test()) && x.value && x.value();但是对函数进行操作的可重用函数会留下更简洁的代码。
-
是的,我知道。我只是想知道 JavaScript 中是否有类似可选链接的东西,因为 JS 充满了惊喜。
标签: javascript optional-chaining