我目前正在开发一个使用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);
});
});
然而,以下(几乎相当于咖啡因):
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);
});
});
这些额外的回报是否会影响我的应用程序的性能,它会改变它的工作方式吗?我测试了它,似乎是相同的响应时间但是我不确定这会对多个嵌套查询产生什么影响。谢谢!
答案 0 :(得分:4)
好问题!这已经在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;
};
但你甚至不想要results
,你只想添加到state
!
在这种情况下,最好的选择是添加一个空的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的方式写作。