2012-10-03 13 views
40

Ho chiesto prima la domanda this e dopo aver riflettuto sull'argomento, ho iniziato a chiedermi dove si trova il confine apparentemente confuso tra i significati dei termini "affermazione" e "espressione". Tutte le affermazioni sono anche espressioni? Da dove provengono i valori di ritorno in una console REPL? Non sempre sembrano avere un senso intuitivo. Naturalmente se si digita 1+1, si ottiene 2, ma altre volte non è così ovvio quale sia la logica.Javascript: differenza tra una frase e un'espressione?

Dato che qualcosa digitato in REPL produce valore, significa che può essere utilizzato nel codice sorgente JS sia come espressione sia come istruzione indipendente?

la stringa di codice che può essere utilizzata per _X_ nel seguente snippet può essere utilizzata anche per _Y_ e viceversa? if(_X_) _Y_

+0

Il fatto che si può 'eval'uate codice JS mi fa pensare che tutte le dichiarazioni sono espressioni di JS –

risposta

30

Tutte le istruzioni sono anche espressioni?

"Ovunque JavaScript si aspetta una dichiarazione, è anche possibile scrivere un'espressione. Tale affermazione è chiamata affermazione di espressione. Il contrario non regge: non puoi scrivere una dichiarazione dove JavaScript si aspetta un'espressione. Ad esempio, un'istruzione if non può diventare l'argomento di una funzione “

Questo è proviene da un recente post di Axel Rauschmayer su questo argomento:. Expressions versus statements in JavaScript

Spero che aiuta.

+0

Attendo con ansia di leggere l'articolo. – wwaawaw

+2

Qualche ulteriore lettura per le persone interessate a saperne di più sulla dichiarazione e l'espressione di javascript, es. differenze, parole chiave e così via: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators e anche https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements –

18

L'espressione produce o valuta un valore.

Esempi di espressioni: new Date() produce un nuovo oggetto Date senza alcun effetto collaterale. [1,2,3] produce un nuovo array senza alcun effetto collaterale. 5+6 produce un nuovo valore 11. Produce solo un nuovo valore senza alcun effetto collaterale.

L'istruzione produce un comportamento o fa qualcosa e ha anche qualche effetto collaterale. Sulla base dell'effetto collaterale, le dichiarazioni possono essere categorizzate.

x=5; è una dichiarazione e qui l'effetto collaterale è assegnazione o modifica in x.

setTimeout() - l'inizio del timer è l'effetto collaterale.

Le dichiarazioni sono generalmente separate da punto e virgola.

Le espressioni di espressione sono l'espressione che ha qualche effetto collaterale o semplicemente "espressione con effetto collaterale".

Esempi di istruzione di espressione:

x+=6; è il complesso di espressione (gruppo di espressioni primarie) sta facendo incarico che è un effetto collaterale, la cosiddetta istruzione di espressione.

delete a[2]; 
+6

'x = 5;' è una "espressione". 'x = 5' (senza punto e virgola) è un'espressione. Se il comportamento è prodotto o qualcosa è fatto o non è * non * il criterio che definisce - vedi la mia risposta per ulteriori informazioni. –

19

Secondo MDN:

Un'espressione è qualsiasi unità valida di codice che possa avere un valore.

Come tale, qualsiasi cosa che può essere utilizzata come valore di rvalore è un'espressione.

Il criterio è non se esistono effetti collaterali. Le espressioni possono sicuramente avere effetti collaterali. Per esempio. a=2 è un'espressione in quanto ha un valore (2) e assegna anche un valore a una variabile. Quale è il motivo per cui si possono fare cose come:

let a; 
let b = 1 + (a = 2); // a is now 2 and b is 3 

E 'possibile che lo stesso (testualmente) blocco di codice da considerare sia l'espressione e una dichiarazione in base al contesto. Per esempio. il frammento di testo function f(){} è un'espressione sulla linea 1 e una dichiarazione in linea 2 nel seguente codice:

let g = function f() {}; 
function f() {}; 

Quindi, se qualcosa è un'espressione o di una dichiarazione non può (nel caso generale) essere pronunciata cercando in un pezzo di codice testuale fuori dal contesto; piuttosto è una proprietà di un nodo in un albero di sintassi e può essere pronunciata solo dopo che il codice è stato analizzato (mentalmente o effettivamente).

Inoltre, e forse ancora più importante, le istruzioni di funzione (a.k.a dichiarazioni di funzioni) all'interno di una funzione f fanno parte del contesto di esecuzione che viene creato quando viene richiamata la funzione f. Tuttavia, le espressioni di funzione non fanno parte del contesto di esecuzione.

Un effetto spesso citato di questo è che le dichiarazioni di funzione vengono "issate" mentre le espressioni di funzione no.

Un effetto più sottile può anche essere osservato sperimentalmente in ricorsioni profonde dato che le istruzioni di funzione occupano spazio nel contesto di esecuzione mentre le espressioni di funzione no. Per esempio. il codice seguente utilizza la ricorsione infinita di una funzione f. Funzione f nel primo caso include una funzione di espressione al suo interno, nel secondo caso esso include la dichiarazione equivalente funzione di:

// Function Expression 
{ 
    let i = 0; 
    try { 

     function f() { 
      i++; 
      (function g() {})(); // this is an expression 
      f(); 
     } 

     f(); 

    } catch (err) { 
     console.log(`Function Expressions case: depth of ${i} reached. Error: ${err.name}`); 
    } 
} 
// Function Declaration 
{ 
    let i = 0; 
    try { 
     function f() { 
      i++; 
      function g() {}; // this is a statement 
      g(); 
      f(); 
     } 

     f(); 

    } catch (err) { 
     console.log(`Functions Declarations case: depth of ${i} reached. Error: ${err.name}`); 
    } 
} 

Sulla mia macchina ho sempre ottenere il seguente (in node.js):

Function Expressions case: depth of 17687 reached. Error: RangeError 
Functions Declarations case: depth of 15476 reached. Error: RangeError 

& hellip; che è coerente con il fatto che le dichiarazioni di funzione aumentano la quantità di spazio necessaria per contenere un contesto di esecuzione e quindi consumano lo spazio dello stack un po 'più velocemente e quindi riducono leggermente la profondità massima di ricorsione.

+0

Ottima risposta! Grazie –

+0

la differenza di profondità deriva da un numero diverso di variabili.lo stile dell'istruzione introduce una nuova variabile g nell'ambito, lo stile di espressione no. quando si aggiunge 'let g =' prima dell'espressione, quindi le profondità saranno uguali – Lauri

+0

@Lauri il contesto di esecuzione è ciò che detiene le variabili locali. Le espressioni di funzione non aggiungono nulla al contesto di esecuzione mentre le dichiarazioni di funzione lo fanno. Vedi anche: https://stackoverflow.com/a/9384894/274677 –

5

Nei termini più semplici, le espressioni vengono valutate per produrre un valore. D'altra parte, le istruzioni vengono eseguite per far accadere qualcosa.

+0

Una dichiarazione può anche essere valutata per produrre un valore, ad es. 'var x = makeSomethingHappen();', quindi questa risposta non è corretta. (Hai letto la risposta accettata? È stato coperto.) – Mogsdad

+1

Correggimi se ho torto, ma non è considerata una "dichiarazione di espressione"? Capisco che una dichiarazione può anche essere valutata per produrre un valore come hai dimostrato sopra. Ma una differenza tra un'espressione e un'affermazione può essere riassunta come ho fatto sopra? –

+0

Certo, ma questa risposta non aggiunge ancora nulla che non è coperto nella risposta accettata. – Mogsdad

3

Abbiamo i seguenti due tipi di espressioni:

1.L'espressione booleana viene utilizzata per eseguire il blocco delle istruzioni . enter image description here

2. espressione aritmetica è utilizzato per assegnazioni delle variabili, che funge da dichiarazioni troppo.

Ad esempio: number = number + 1;

6

Tutti i programmi in JavaScript sono fatti di istruzioni e terminano con virgola, except blocco utilizzato per raggruppare zero o più istruzioni. Dichiarazioni sono solo eseguire alcune azioni ma non producono alcun valore o output mentre espressioni restituiscono alcun valore. Quando interprete vede un'espressione, recupera il suo valore e sostituisce l'espressione con un nuovo valore. Le istruzioni sono usate per manipolare quelle espressioni. È possibile controllare se si tratta di un'espressione o di una dichiarazione qui: JavaScript Parser

+0

Good link Eldiyar. –

4

Espressione: un'unità di codice che si risolve in un valore, come esempio, letterali & operatori. Esempi di espressioni:

> 3 
> 1 + 2 
> "expression" 
> fn() 
> [] 
> {} 


Dichiarazione: un'unità di codice che rappresenta un'istruzione o più, di solito inizia con un linguaggio riservato parola chiave e le estremità, esplicitamente o implicitamente, con un terminatore dichiarazione. Esempi di dichiarazioni:

> 3; 
> let x = 3; 
> if() {} 
> for() {} 
> while() {} 
1

mi raccomando di leggere post completo del Dr. Axel Rauschmayer
Expressions versus statements in JavaScript
come indicato nel @ risposta accettato di ZER0 sopra.

Ma la mia scorciatoia ricordo preferito è:

Espressione:
e può essere impostato E qual ad un Expression
..o Expressed stampandolo.
Dichiarazione:
.. tutto il resto.


Il seguente è modificato da
Anders Kaseorg's Quora answer.

Una dichiarazione è una riga completa di codice che esegue un'azione.

E molto E xpression può essere usato come una dichiarazione
(il cui effetto è quello di valutare l'espressione, e ignorare il valore risultante).

Ma una xpressione E è una qualsiasi sezione del codice che e valorizza a un valore e.

Le espressioni possono essere combinate "orizzontalmente" in espressioni più grandi utilizzando gli operatori.
E ha una parte superiore orizzontale piatta

La maggior parte delle informazioni non possono essere utilizzati come espressioni.

Le istruzioni possono essere combinate "verticalmente" scrivendo una dopo l'altra o con costrutti di blocco.
S in verticale rispetto al confronto.


From Quora Post by Ryan Lam:

Ecco una regola generale: Se è possibile stampare, oppure assegnarlo a una variabile, è un'espressione. Se non puoi, è una dichiarazione.

Ecco alcuni esempi di espressioni:

2 + 2 
3 * 7 
1 + 2 + 3 * (8 ** 9) - sqrt(4.0) 
min(2, 22) 
max(3, 94) 
round(81.5) 
"foo" 
"bar" 
"foo" + "bar" 
None 
True 
False 
2 
3 
4.0 

Tutto quanto sopra può essere stampato o assegnata a una variabile.

Ecco alcuni esempi di istruzioni:

if CONDITION: 
elif CONDITION: 
else: 
for VARIABLE in SEQUENCE: 
while CONDITION: 
try: 
except EXCEPTION as e: 
class MYCLASS: 
def MYFUNCTION(): 
return SOMETHING 
raise SOMETHING 
with SOMETHING: 

Nessuno dei costrutti di cui sopra può essere assegnato a una variabile. Sono elementi sintattici che servono a uno scopo, ma non hanno essi stessi alcun "valore" intrinseco. In altre parole, questi costrutti non "valutano" nulla. Cercando di fare una qualsiasi delle seguenti, ad esempio, sarebbe assurdo, e semplicemente non avrebbe funzionato:

x = if CONDITION: 
y = while CONDITION: 
z = return 42 
foo = for i in range(10): 
Problemi correlati