{1 + ''} + 10 // 10
{1 + ''} + '' // 0
Perché ciò accade? BlockStatements restituisce 0 e perché?confusione di BlockStatement JavaScript
{1 + ''} + 10 // 10
{1 + ''} + '' // 0
Perché ciò accade? BlockStatements restituisce 0 e perché?confusione di BlockStatement JavaScript
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.
Grazie! Inizialmente ero stato confuso perché '{''} + 'a'' restituisce' NaN', ma ora ho capito che è a causa del +. – callumacrae
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). –
@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. –