Coffeescript三元if语句错误的逻辑

时间:2013-02-21 15:10:28

标签: javascript jquery if-statement coffeescript

我在返回函数中有一个非常简单的逻辑,但它没有按预期工作。当然,我可以使代码稍长一些并解决问题,但我希望它尽可能小。

这是我的代码:

#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;

http://jsfiddle.net/X8VjJ/1/

谢谢!

2 个答案:

答案 0 :(得分:3)

  

如果在#pageTitle中找到#mainContent,则应将其设为红色

您可以使用更简单的方法完成此任务:

 $('#mainContent #pageTitle').css(color: 'red')

因为,如果 没有在#pageTitle中找到#mainContent,它会尝试更改一组空元素的css - 无操作。

您提供的代码并没有多大意义。 ?.是不必要的,因为如果jQuery选择器不匹配,它将不会返回nullundefined;它将返回一组空元素。因此,它始终会返回length,它始终是一个数字,因此分配将永远不会执行,因为它取决于length返回nullundefined。这很好,因为您可能不希望将元素的长度设置为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),因为它总是一个元素数组(如果没有找到则为零长度)。