Javascript Coffeescript三元if语句逻辑错误
我在一个返回函数中有一个非常简单的逻辑,但它并不像预期的那样工作。当然,我可以使代码稍微长一点并解决这个问题,但我希望它尽可能小 这是我的密码:Javascript Coffeescript三元if语句逻辑错误,javascript,jquery,if-statement,coffeescript,Javascript,Jquery,If Statement,Coffeescript,我在一个返回函数中有一个非常简单的逻辑,但它并不像预期的那样工作。当然,我可以使代码稍微长一点并解决这个问题,但我希望它尽可能小 这是我的密码: #Return title if exists or false otherwise getPageTitleFromMainContent = (mainContent) -> mainContent.find('#pageTitle') ?.length ?= false if y = (getPageTitleFromMainCon
#Return title if exists or false otherwise
getPageTitleFromMainContent = (mainContent) ->
mainContent.find('#pageTitle') ?.length ?= false
if y = (getPageTitleFromMainContent $("#mainContent"))
y.css color:red
如您所见,如果它在#main content中找到#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
});
}
它应该是\u ref:\u ref.length=false:void 0代码>,而非\u ref**1**:\u ref.length=false:void 0代码>
谢谢大家! 不确定代码是否有意义。除非定义了长度,否则您实际上是在尝试分配给length属性。如果定义了它,它只返回length属性。看起来代码和行为是正确的,但您对存在运算符和返回值的理解是错误的。如果要返回找到的元素,可能需要将其与长度检查断开连接
可能是这样的:
getPageTitleFromMainContent = (mainContent) ->
arr = mainContent.find('#pageTitle')
if arr.length then arr else false
正如Ian在其更优雅的回答中所解释的,您不需要在arr上使用存在运算符(假设使用jquery),因为它将始终是一个元素数组(如果找不到,则长度为零)。不确定代码是否有意义。除非定义了长度,否则您实际上是在尝试分配给length属性。如果定义了它,它只返回length属性。看起来代码和行为是正确的,但您对存在运算符和返回值的理解是错误的。如果要返回找到的元素,可能需要将其与长度检查断开连接
可能是这样的:
getPageTitleFromMainContent = (mainContent) ->
arr = mainContent.find('#pageTitle')
if arr.length then arr else false
正如Ian在其更优雅的回答中所解释的,您不需要在arr上使用存在运算符(假设使用jquery),因为它将始终是一个元素数组(如果找不到,则长度为零)
如果在#main content
中找到#pageTitle
,则应将其变为红色
您可以通过更简单的方法来实现这一点:
$('#mainContent #pageTitle').css(color: 'red')
因为,如果它在#mainContent
中找不到#pageTitle
,它将尝试更改一组空元素的css——一个不可操作的元素
您所展示的代码没有真正意义<代码>?。
是不必要的,因为如果不匹配,jQuery选择器将不会返回null
或undefined
;它将返回一组空的元素。因此,它将始终返回length
,这将始终是一个数字,因此赋值将永远不会执行,因为它取决于length
返回null
或未定义的。这很好,因为您可能不想将元素的长度设置为false
最后,这不是三元if语句。CoffeeScript的三元if语句如下所示:if-foo-then-bar-else-baz
如果在#main content
中找到#pageTitle
,则应将其变为红色
您可以通过更简单的方法来实现这一点:
$('#mainContent #pageTitle').css(color: 'red')
因为,如果它在#mainContent
中找不到#pageTitle
,它将尝试更改一组空元素的css——一个不可操作的元素
您所展示的代码没有真正意义<代码>?。
是不必要的,因为如果不匹配,jQuery选择器将不会返回null
或undefined
;它将返回一组空的元素。因此,它将始终返回length
,这将始终是一个数字,因此赋值将永远不会执行,因为它取决于length
返回null
或未定义的。这很好,因为您可能不想将元素的长度设置为false
最后,这不是三元if语句。CoffeeScript的三元if语句如下所示:if foo then bar else baz
如果元素不存在,jquery将返回一个空数组,我不希望这样;我希望它返回false。而且,正如我所说的,如果不指定值,那就很好了。coffeescript非常强大,我想利用它。用建议的解决方案更新了我的答案。如果元素不存在,jquery将返回一个空数组,我不希望这样;我希望它返回false。而且,正如我所说的,如果不指定值,那就很好了。咖啡脚本非常强大,我想利用它。用建议的解决方案更新了我的答案。实际的代码并不像改变颜色那么简单——这只是一个例子。您关于sizzle return值的逻辑是正确的。但是有没有一种方法可以实现@Marius Kjeldahl的代码,而不使用任何变量,比如el
?我的意思是,你可以搜索两次如果mainContent.find('#pageTitle').length>0,则mainContent.find('#pageTitle')否则为false
,或者类似于mainContent.find('#pageTitle').length&&mainContent.find('#pageTitle')
。那更糟。尽可能编写可读性最好的代码。把它压缩成一个表达式并没有什么好处,它会让你或其他人将来更难理解代码。对。我想我已经尽力解决这个小问题了\u ref
获取\main content
,但是当coffeescript
看到.length?
时,它不能通过\u ref
变量的运算符返回,它返回的是长度的\u ref1
。我会让这个问题暂时得不到回答;只是跳跃。正如Ian指出的,易读易懂的代码每次都胜过smartypants表达式和运算符,并且随着“每一次”之间的时间越来越长,变得更加重要。实际的代码并不像更改颜色那么简单——这只是一个例子。您关于sizzle return值的逻辑是正确的。但是有没有一种方法可以实现@Mar的目标呢