2011-12-06 66 views
3

我知道,你可以这样做:为什么`x && return`无效?

function first(a){ 
    a && console.log("true"); 
} 

这是一样的:

function first(a){ 
    if(a){ 
     console.log("true"); 
    } 
} 

然而,当我尝试这样做:

function first(a){ 
    a && return false 
} 

它不工作,它会抛出一个错误。为什么它给我一个错误?

+3

更重要的是,使用'if'控制流程,和'&&为了逻辑和。 –

+1

你的前两个例子具有相同的效果,但它们并不相同,因为'a && console.log(“true”)'是一个返回值的表达式(在这种情况下,你只是不使用该值)。 – nnnnnn

回答

10

return只能在声明中使用。

a && return false它将成为表达式的一部分,这在语法上是错误的。

+1

...因为相对于'的console.log(...)','return'不是函数调用,因此,因为它不会产生一个值 – Martin

+3

其是是关键字之间的差异是不表达作为语句的操作符和关键字 - 像'new'这样的东西可以内联,因为它们是表达式,其中像'return','break','continue'这样的语句 - 这些是块级别的。 –

+0

我让我的答案是一个社区wiki。随意添加您的评论。你们都是对的。 – kay

0

您可以通过将返回该行开始得到你想要的效果:

return a && console.log("true"); 

returnstatement的一部分,不能被放置在期望一个表达式(如操作的地方的逻辑运算符)。

+2

我不回来'console.log' –

6

如果你真的想这样做的,你可以这样做

return a && false || undefined 

或missingno的缘故,

return (a && false) || undefined 

由于&&优先||,它会先评估 - 但是parens很酷,而且总是很喜欢派对。

此外,检查出的规格:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf - 第68页显示了表达式运算符(如new)如何从报表有所不同一样return(第93页)

0

第一个唯一的作品,因为& &是短路逻辑与,这意味着只有当两个表达式都为真时才是真的

因此,如果A的计算结果为真(即,A不是空的,未定义的或空字符串),它还必须检查console.log (“true”)为真,因此调用方法

如果A是假,则表达式将是假的,所以没有必要调用方法(短路)

使其更清晰,如果你这样做

A & console.log("test") 

测试将被记录,无论什么是A的价值是

第二个不起作用,因为它是它自己的声明...这是同样的努力

if(A && return false) { 
    //doesn't work 
} 

正确的方法是

return A || B; 

这将返回B如果一个计算结果为假

+0

_“如果A是假的,表达会出现假” _ - 如果有一个falsy值表达式将返回A(否则将返回另一个操作数)。所以如果A是,比如说“”表达式将返回“”,而不是假。 – nnnnnn

+0

@nnnnnn,你是对的,但这不是我想解释的。我的意思是解释&&是一个短路运算符,当第一个计算结果为false时,整个表达式将是错误的,因此不会评估第二个 – Andre