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

我目前正在开发一个利用Express.js和Mongoose的node.js Web服务.最近,我认为我会尝试使用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永远不会改变代码的行为-除非您期望函数始终返回未定义.

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

作为CoffeeScript的长期用户,我的观点是,您早日享受隐式回报,而不是迟于享受.它促使您以更多的functional方式写作.

上一篇:使用Java实现寻找一个字符串中最长的对称字符串


下一篇:用JavaScript计算字符串中的句子