2012-03-21 15 views

risposta

11

Do BlockStatements restituisce 0 ...?

No, blocks restituisce il valore dell'ultima espressione al loro interno. Si può vedere questo da solo facendo:

{1 + 8} 

... nella console JavaScript, che mostrerà 9.

{1 + ''} + 10 // 10
{1 + ''} + '' // 0
Perché accade questo?

Perché sebbene il blocco restituisca un valore, tale valore non viene utilizzato. {1 + ''} + 10 // 10 codice è valutata come due elementi distinti:

{1 + ''} // "1" 
+10  // 10 

... o la scrittura di quelli con il rientro di serie e punti e virgola:

{ 
    1 + ''; 
} 
+10; 

... e si sta vedendo il risultato del secondo, come se il primo non fosse affatto lì. Il + non è l'operatore di addizione, è lo unary+ (simile allo unary -, ma non modifica il segno del suo operando). +10 è, ovviamente, 10; eè 0 perché l'applicazione dell'operatore a una stringa converte la stringa in numero e Number('') è 0.

Si può dimostrare che si sta vedendo la + piuttosto che l'operatore di addizione unaria provando questo:

{1 + ''} * 10 

... che è davvero

{ 
    1 + ''; 
} 
*10; 

non riesce con un errore di sintassi perché non c'è un unario *.

Come Felix sottolinea gentilmente fuori nei commenti qui sotto, per la + nel tuo esempio di essere l'operatore di addizione (che avrebbe finito per concatenazione di stringhe, nel tuo caso), che avrebbe dovuto essere between two expressions, e un il blocco è un statement, non uno expression.

+0

Grazie! Inizialmente ero stato confuso perché '{''} + 'a'' restituisce' NaN', ma ora ho capito che è a causa del +. – callumacrae

+2

Questo non è corretto al 100%: http://es5.github.com/#x12.1 * "Restituisce il risultato della valutazione di StatementList." *. Non fa la differenza però, dato che un blocco è un'affermazione e quindi non può essere usato all'interno di un'espressione (almeno questo è il modo in cui lo capisco). –

+0

@FelixKling: Grazie per quello! Ho rimosso il bit errato ("I blocchi non restituiscono nulla"). E ora devo andare a scavare nella grammatica (che non ho il tempo di fare al momento) per capire la ragione sottostante del blocco e l'espressione che lo segue sono mantenuti distinti e separati.Lo sono, e sapevo che lo erano, ma non so quale parte precisa della grammatica detta ... :-) Probabilmente, come hai detto tu, hai a che fare con le dichiarazioni e le espressioni. –