2011-12-06 53 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