javascript - Coffeescript 隐式返回对性能和副作用的影响

标签 javascript node.js express coffeescript

我目前正在开发一个使用 Express.js 和 Mongoose 的 node.js 网络服务。最近,我想尝试一下 CoffeeScript,因为我听说它有一些好处。但是,我注意到了一些令人不安的事情,我很好奇是否有人可以澄清一下。

这是我用普通 javascript 编写的路线之一:

router.post('/get/:id', decorators.isManager, function(req, res) {
    Group.findById(req.params.id, function(err, grp) {
            if(err) res.status(500).end();
            if(grp == null) res.status(500).send('The group could not be found');
            res.send(grp);
    });
});

但是,使用以下(几乎等同于 coffeescript):

router.post '/get/:id', decorators.isManager, (req, res) ->
  Group.findById req.params.id, (err, grp) ->
    res.status(500).end() if err
    res.status(500).send 'The group could not be found' if not grp?
    res.send grp

将其重新编译为 javascript 会返回以下内容:

router.post('/get/:id', decorators.isManager, function(req, res) {
    return Group.findById(req.params.id, function(err, grp) {
            if(err) res.status(500).end();
            if(grp == null) res.status(500).send('The group could not be found');
            return res.send(grp);
    });
});

这些额外的返回会影响我的应用程序的性能吗,它会改变它的工作方式吗?我测试了它,它似乎是相同的响应时间但是我不确定这会对多个嵌套查询产生影响。谢谢!

最佳答案

好问题!这已在 this pull request 中进行了广泛讨论。 .

关于性能

请记住,返回 undefined 或任何其他值在性能方面几乎是等效的。

但是,所有差异都非常小,因此您不必担心。您可以在这个快速而肮脏的基准测试中比较实际速度变化:http://jsperf.com/return-undefined-vs-value

有一种特殊情况,它可能会造成更大的伤害:函数中的最后一条语句会产生一个数组。 CoffeeScript 将分配数组并为您返回它。

例如在 CoffeeScript 中你可以这样写:

state = 1

changeState = ->
  (state++ for i in [0..9])

将被转译为:

var changeState, state;

state = 1;

changeState = function() {
  var i, j, results;
  results = [];
  for (i = j = 0; j <= 9; i = ++j) {
    results.push(state++);
  }
  return results;
};

但您甚至不想要结果,您只想添加到状态!

在这种情况下,最好的选择是添加一个空的 return 语句:

state = 1

changeState = ->
  (state++ for i in [0..9])
  return

这将导致

var changeState, state;

state = 1;

changeState = function() {
  var i, j;
  for (i = j = 0; j <= 9; i = ++j) {
    state++;
  }
};

关于意外后果

CoffeeScript 永远不会改变您代码的行为 - 除非您期望一个函数总是返回undefined

不过这并不常见,也不是很有用。如果您想检查返回值,可能需要一些东西。如果您从未使用过返回值,则返回一些内容将无关紧要。

作为 CoffeeScript 的长期用户,我的观点是您尽早享受隐式返回。它促使你写得更多 functional方式。

关于javascript - Coffeescript 隐式返回对性能和副作用的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29070113/

相关文章:

html - Node js hbs 模块和引擎

node.js - electronic-packager并未使用它 package 我的目录之一。有任何解决这个问题的方法吗?

node.js - 使用 --module 选项在 Sublime Text 中使用 Typescript 构建系统配置

javascript - 引导新的 Strapi 角色权限

javascript - 为什么不能在 $(this) 上调用 outerHTML?

javascript - 替换 JSON 文件中的整个数据 block

javascript - Express 呈现index.html 但不呈现其他页面

javascript - 防止函数重新渲染模板

javascript - Chrome 扩展 : Record Microphone and Speaker in Background JS

javascript - 视口(viewport)大小调整在 ios 中不起作用