2011-09-07 11 views
5

Lasciate f e g due funzioni. Quindi f() || g() prima valuta f. Se il valore di ritorno di f è falsy, allora valuta g e restituisce il valore di ritorno di g.Estensione dell'OR logico || sintassi per l'array vuoto

Mi piace la sintassi netta e concisa, ma non include il caso in cui f restituisce l'array vuoto [], che voglio considerare "falsy".

C'è un modo pulito di avere questa sintassi per [] invece dei valori falsy tradizionali?

+1

'[]' è un array vuoto, '{}' è un oggetto vuoto. Quale vuoi considerare falsy? O è entrambi? – Paulpro

+0

Mi dispiace, array vuoto '[]'. Modificherò la mia domanda. – Randomblue

+0

Ulteriori informazioni sulla funzione f sarebbero utili. Ad esempio, se restituisce sempre un array, puoi fare 'f(). Length || g() '. Che eseguirà g se la lunghezza dell'array è falsa (0 elementi) – Paulpro

risposta

5

Si potrebbe scrivere una funzione che converte l'array vuoto in un vero valore di falsa, forse?

function e(a) { return a instanceof Array ? (a.length ? a : false) : a; } 

var result = e(f()) || g(); 
+1

+1 Questa è una bella soluzione – Paulpro

+0

Tranne che è necessario modificare la funzione 'e' che restituirà falsy per qualsiasi non-array sincero (o qualsiasi cosa senza proprietà length). Cambiarlo in: 'function e (a) {return typeof a.length === 'number' &&! A.length? falso: a; } ' – Paulpro

+0

+1 molto intelligente. – jondavidjohn

0

Perché non semplicemente fare il check lunghezza a f()?

function f(){ 
    var returned_array = new Array(); 
    ... 
    if(!returned_array.length) 
    return false; 
} 
1

Il problema con le altre soluzioni presentate è che non si comporta esattamente come si desidera che il cortocircuito funzioni. Ad esempio, convertendo il valore di f() in un valore di verità prima che l'operatore || significhi perdere la capacità di restituire il risultato di f(). Quindi ecco la mia soluzione preferita: scrivere una funzione che si comporta come l'operatore ||.

// let's call the function "either" so that we can read it as "either f or g" 
function either() { 
    var item; 
    // return the first non-empty truthy value or continue: 
    for (var i=0;i<arguments.length;i++) { 
     item = arguments[i]; 
     if (item.length === 0 || !item) continue 
     return item; 
    } 
    return false; 
} 

ora possiamo usare la funzione either() come come ci sarebbe il || dell'operatore:

either(f(), g()); 
0

Se si sta parlando in realtà di sovraccaricare il || operatore, non è possibile farlo in JavaScript (era proposed back in ECMAScript 4 ma rifiutato). Se vuoi veramente fare un sovraccarico dell'operatore in JavaScript, dovresti usare qualcosa come JavaScript Shaper, che è "un framework estensibile per la modellazione dell'albero della sintassi di JavaScript" - potresti effettivamente use this to overload operators.