CoffeeScript有这样的语法糖:
item.getFoo?().fooParam?.bar
通过getFoo==null
和fooParam==null
检查转化为等效的长javascript。问题是:有没有办法在vanilla javascript中使用这种语法,而不是使用CoffeeScript之外的库/翻译器/编译器?我们在项目中使用Traceur,但它没有这样的语法,因为它不符合ES6(尽管我希望如此)。也许某种方式在Traceur fork中实现它?
答案 0 :(得分:4)
如果你不想要确切的CoffeeScript语义,你可以作弊:
return item.getFoo ? (item.getFoo().fooParam || {}).bar : undefined;
这里有一些技巧。
item.getFoo
fooParam
缺失,假名或缺席,我们会用空对象替换它。 CoffeeScript会在这里得到保释。bar
的值,无论它是否存在。如果确实存在,则获得所需的值。如果它不存在但设置了fooParam
,则会得到undefined
。如果它不存在,因为fooParam
未定义且我们回到{}
,您仍会获得undefined
。如果三元运算符妨碍了你可以编写一些助手:
function defaultObject(input) { // A helper to put somewhere
return input || {};
}
return defaultObject((item.getFoo || defaultObject)().fooParam).bar;
这更加棘手:defaultObject
在使用{}
调用时会返回getFoo
,因此您不需要在函数调用周围使用三元运算符。如果fooParam
不是真的,defaultObject
将返回另一个空对象,从而无需另一个||
。如果fooParam
是真实的,defaultObject
的行为与身份函数相似并将其返回。
我确定这可以进一步打高尔夫球,但我建议避免使用这种模式。任何阅读你的代码的人都会相当困惑,并责怪你在代码库中乱七八糟。
答案 1 :(得分:1)
我最近有同样的问题,我来到这里希望有一个比现在更好的解决方案。如果你经常这样做,那么为你做一个函数会更容易:
var qm = function(arg) {
if (arg instanceof Object) return arg;
return function(){};
};
然后使用它,将对象包装在其中以确保不会引发错误。如果行上有许多 q uestion m arks,它会开始看起来很丑陋
qm(qm(item.getFoo)().fooParam).bar