javascript - 没有 CoffeeScript 的 CoffeeScript 问号语法

标签 javascript coffeescript

CoffeeScript 有这样的语法糖:

item.getFoo?().fooParam?.bar

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

最佳答案

如果您不想要确切的 CoffeeScript 语义,您可以作弊:

return item.getFoo ? (item.getFoo().fooParam || {}).bar : undefined;

这里有一些技巧。

  1. 三元运算符用于测试item.getFoo的真实性
  2. 如果 fooParam 丢失、错误或不存在,我们用一个空对象替换它。 CoffeeScript 会在这里退出。
  3. 我们返回 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/

相关文章:

javascript - coffeescript 中的命名空间

ruby-on-rails - 如何在 Slim 模板内访问 CoffeeScript 引擎中的实例变量

javascript - 使用超时来做跳转功能

javascript - 如何注入(inject) app.run 函数中使用的模拟 Angular 服务?

javascript - 如何通过coffeescript获取对象的所有值?

javascript - JS/CoffeeScript : Element doesn't receive focus on . 焦点()

jquery - Ajax 附加对象在 dom 中不可见

php - 将变量从 php 传递到 javascript

javascript - 滑动js自定义宽度

javascript - AngularJS - 通过指令向按钮添加 onClick 事件