我在返回函数中有一个非常简单的逻辑,但它没有按预期工作。当然,我可以使代码稍长一些并解决问题,但我希望它尽可能小。
这是我的代码:
#Return title if exists or false otherwise
getPageTitleFromMainContent = (mainContent) ->
mainContent.find('#pageTitle') ?.length ?= false
if y = (getPageTitleFromMainContent $("#mainContent"))
y.css color:red
如您所见,如果它在#mainContent中找到#pageTitle,它应该变为红色。但是如果找到它,函数不返回#pageTitle,它返回.length。
从js2coffee.org我看到代码编译成:
var getPageTitleFromMainContent, y;
getPageTitleFromMainContent = function(mainContent) {
var _ref, _ref1;
return (_ref = mainContent.find('#pageTitle')) != null ? (_ref1 = _ref.length) != null ? **_ref1 : _ref.length = false : void 0;**
};
if (y = getPageTitleFromMainContent($("#mainContent"))) {
y.css({
color: red
});
}
它应该是_ref : _ref.length = false : void 0;
,而不是_ref**1** : _ref.length = false : void 0;
。
谢谢!
答案 0 :(得分:3)
如果在
#pageTitle
中找到#mainContent
,则应将其设为红色
您可以使用更简单的方法完成此任务:
$('#mainContent #pageTitle').css(color: 'red')
因为,如果 没有在#pageTitle
中找到#mainContent
,它会尝试更改一组空元素的css - 无操作。
您提供的代码并没有多大意义。 ?.
是不必要的,因为如果jQuery选择器不匹配,它将不会返回null
或undefined
;它将返回一组空元素。因此,它始终会返回length
,它始终是一个数字,因此分配将永远不会执行,因为它取决于length
返回null
或undefined
。这很好,因为您可能不希望将元素的长度设置为false
。
最后,这不是三元if语句。 CoffeeScript的三元if语句如下所示:if foo then bar else baz
。
答案 1 :(得分:2)
不确定代码是否有意义。除非定义了长度,否则您有效地尝试分配TO属性。如果已定义,则只返回length属性。看起来代码和行为是正确的,但是您对存在运算符和返回值的理解是错误的。如果要返回找到的元素,可能需要将其与长度检查断开。
可能是这样的:
getPageTitleFromMainContent = (mainContent) ->
arr = mainContent.find('#pageTitle')
if arr.length then arr else false
正如Ian在他更优雅的答案中所解释的那样,你不需要在arr上使用存在运算符(假设jquery),因为它总是一个元素数组(如果没有找到则为零长度)。