CoffeeScript 有这样的语法糖:
item.getFoo?().fooParam?.bar
这转化为长 javascript 等效于 getFoo==null
和 fooParam==null
检查。问题是:除了 CoffeeScript 之外,有没有什么方法可以在 vanilla javascript 中使用这种语法和库/翻译器/编译器?我们在我们的项目中使用 Traceur,但它没有这样的语法,因为它不符合 ES6(尽管我希望它符合)。也许可以通过某种方式在 Traceur fork 中实现它?
最佳答案
如果您不想要确切的 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
的行为类似于恒等函数并返回它。
我确信这可以进一步降低,但我建议避免这种模式。阅读您的代码的任何人都会相当困惑,并责备您将代码库弄得一团糟。
关于javascript - 没有 CoffeeScript 的 CoffeeScript 问号语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25784360/