没有 CoffeeScript 的 CoffeeScript 中的问号语法

Posted

技术标签:

【中文标题】没有 CoffeeScript 的 CoffeeScript 中的问号语法【英文标题】:Question mark syntax from CoffeeScript without CoffeeScript 【发布时间】:2014-11-05 05:17:24 【问题描述】:

CoffeeScript 有这样的语法糖:

item.getFoo?().fooParam?.bar

这转化为与getFoo==nullfooParam==null 检查等效的长javascript。问题是:有没有办法在 vanilla javascript 中使用除了 CoffeeScript 之外的库/翻译器/编译器的这种语法?我们在我们的项目中使用 Traceur,但它没有这样的语法,因为它不符合 ES6(尽管我希望它)。也许有什么方法可以在 Traceur fork 中实现它?

【问题讨论】:

你尝试过 fork 吗?问题出在哪里? 我似乎太难学习内部 Traceur 的工作原理来实现这个小功能。 此外,您可能与在咖啡脚本中重新定义为 if … then … else… 的三元运算符 (…?…:…) 发生冲突 也许可以使用 sweet.js 之类的东西? @phenomnomnominal Brototype 看起来完全像我在生产环境中使用的扩展。 【参考方案1】:

如果你不想要确切的 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 的行为类似于身份函数并返回它。

我确信这可以进一步降低,但我建议避免这种模式。任何阅读您的代码的人都会感到相当困惑,并责怪您在代码库中弄得一团糟。

【讨论】:

【参考方案2】:

我最近也有同样的问题,我来到这里希望得到比我目前更好的解决方案。如果您经常这样做,则可以更轻松地为您创建一个函数:

var qm = function(arg) 
  if (arg instanceof Object) return arg;
  return function();
;

然后要使用它,您将对象包装在其中以确保不会引发错误。如果一行中有很多q问题m方舟

,它开始看起来很难看
qm(qm(item.getFoo)().fooParam).bar

【讨论】:

刚刚意识到,当上下文 (this) 发挥作用时,这完全崩溃了。【参考方案3】:

optional chaining operator?. 是在 ES2020 中引入的。

obj.val?.prop
obj.val?.[expr]
obj.arr?.[index]
obj.func?.(args)

根据https://caniuse.com/mdn-javascript_operators_optional_chaining,截至 2021 年 11 月 29 日,91.81% 的互联网用户的浏览器都支持它。

【讨论】:

以上是关于没有 CoffeeScript 的 CoffeeScript 中的问号语法的主要内容,如果未能解决你的问题,请参考以下文章

没有 CoffeeScript 的 CoffeeScript 中的问号语法

如何使用 slick 进行聚合

CoffeeScript单元测试?

如何在 Slick 2.0 中计数(*)?

有没有更简洁的 Coffeescript 成语呢?

没有 node.js 的 CoffeeScript 编译器?