2015-05-01 10 views
5

In tutte le classifiche JavaScript operatore di precedenza che riesco a trovare (come this one e this one), il logico AND (&&) ha leggermente precedenza maggiore alla logica OR (||).Esempio di espressione in cui la precedenza di AND (&&) su OR (||) è importante?

Non riesco a capire un'espressione in cui il risultato è diverso da quello che sarebbe se avessero la stessa precedenza. Immagino che ci debba essere un modo per fare in modo che siano importanti o che siano elencati come aventi la stessa precedenza se non lo fossero.

Ad esempio:

0 || 2 && 0 || 3 

è 3, ma non importa come mi slice che in su, è sempre sarà 3:

(0 || 2) && 0 || 3 

0 || (2 && 0) || 3 

(0 || 2 && 0) || 3 

0 || 2 && (0 || 3) 

0 || (2 && 0 || 3) 

Se faccio quel primo 0 qualcosa altrimenti (come 4), il risultato è sempre 4 perché il primo || non guarda nemmeno sul lato destro. Se scambio lo 0 e 3 nell'ultimo || in giro, il risultato rimane 3.

Il più vicino mi è venuta è

0 || false && "" || NaN 

... che è NaN, mentre

0 || false && ("" || NaN) 

... è false, ma penso che sia spiegato puro sinistra-to semantica destra, non da && essendo precedenza più alta.

Mi manca solo, per quale espressione è importante che && abbia una precedenza più alta di ||?

+0

solo fare un ipotesi: come ripiego forse? – maioman

+3

'true || false && false' –

risposta

3

Se avessero la stessa precedenza e fossero associati a sinistra, quindi ad es. l'espressione

1 || 0 && 2 

sarebbe

((1 || 0) && 2) // evaluates to 2 

al posto del

(1 || (0 && 2)) // evaluates to 1 

che otteniamo dai "soliti" regole di precedenza.


Per la vostra struttura … || … && … || … (che sarebbe (((… || …) && …) || …) invece di normale ((… || (… && …)) || …)), si otterrebbe risultati diversi per valori come 0 0 1 0.


Perché la logica e hanno la precedenza leggermente superiore alla logica OR?

In modo che la forma canonica di espressioni booleane, il disjunctive normal form, non ha bisogno di alcuna parentesi.

+0

Ero sicuro di averlo provato, ma chiaramente no! Grazie. –

3
true || false && false 

è true

(true || false) && false 

è false

true || (false && false) 

è true

+0

È anche facile vedere una differenza se si utilizzano oggetti anziché booleani. Ad esempio, '{a: 1} || {b: 2} && {c: 3} || {d: 4} && {e: 5} 'dà' {a: 1} ', mentre' ({a: 1} || {b: 2}) && ({c: 3} || {d: 4 }) && {e: 5} 'dà' {e: 5} '. – aroth

+0

@aroth: Tranne che tutti gli oggetti sono veri. Ma usando (diciamo) '1 || 0 && "" 'lo renderebbe più chiaro, dato che è' 1' ma '(1 || 0) &&" "' è '" "'. –

1

Esempio:

1 || 0 && 0 ->(1 || 0) && 0 ->(1) && 0 ->
1 || 0 && 0 ->1 || (0 && 0) ->1 || (0) ->

Problemi correlati