2013-08-12 14 views
7

Qual è esattamente la differenza tra {?} e {#}?Polvere: differenza tra le sezioni logiche {?} E {#}

-

Dopo un piccolo test, che elenca tutti truthy/falsy values for {?}, e confrontandole con {#}:

contesto:

{ 
    values: [ 
    // false 
    '', 
    "", 
    false, 
    null, 
    undefined, 
    [], 
    // true 
    0, 
    "0", 
    "null", 
    "undefined", 
    "false", 
    {}, 
    {a: 'a'} 
    ] 
} 

modello:

{#values} 
{?.}true{:else}false{/.} 
{/values} 
{~n} 
{#values} 
{#.}true{:else}false{/.} 
{/values} 

emette esattamente lo stesso risultato:

falsefalsefalsefalsefalsefalsetruetruetruetruetruetruetrue 
falsefalsefalsefalsefalsefalsetruetruetruetruetruetruetrue 

-

è veramente C'è qualche differenza tra loro?

risposta

11

C'è una differenza tra # e ?, anche se è un po 'sottile e non si rivela nel tuo esempio.

? (esistente): verifica la veridicità della chiave specificata. Se la chiave è vera, esegui il corpo, altrimenti esegui il corpo :else se ce n'è uno.

# (sezione): verifica la veridicità della chiave specificata. Se la chiave è vera, imposta il contesto sul tasto, quindi esegui il corpo. Se il contesto è una matrice, eseguire il corpo una volta per ciascun elemento nella matrice. Se la chiave non è vera, non modificare i contesti ed eseguire il corpo :else se esiste.

Quindi, se il modello si presentava così, invece:

modello:

{?values} 
{?.}true{:else}false{/.} 
{/values} 
{~n} 
{#values} 
{#.}true{:else}false{/.} 
{/values} 

Poi l'output potrebbe essere:

true 
falsefalsefalsefalsefalsefalsetruetruetruetruetruetruetrue 

La prima riga controlla che values esiste, ma non cambia il contesto. La seconda riga controlla che il contesto corrente (che in questo caso è il contesto di root) esista e stampa true. Poiché ? non entra nel contesto e non esegue il ciclo attraverso la matrice, true viene stampato una sola volta.

+0

Ok, il mio esempio è stato più di prova che '?' E '# 'valuta la verità allo stesso modo ... Se riassumo,' # 'cambia il contesto ed è" array-aware "mentre'? valuta la verità (allo stesso modo di "#" fa). In altre parole, '?' È un sottoinsieme di '#', giusto? – abernier

+0

Esatto. Entrambi possono essere utili, a seconda della situazione. – smfoote

+0

Grazie mille, hai vinto un ✓;) – abernier