2011-09-07 5 views
5

Deje f y g haber dos funciones. Luego, f() || g() primero evalúa f. Si el valor de retorno de f es falso, entonces evalúa g y devuelve el valor de retorno de g.Extendiendo el OR lógico || sintaxis de la matriz vacía

Me encanta la sintaxis ordenada y concisa, pero no incluye el caso en el que f devuelve la matriz vacía [], que quiero considerar "falsy".

¿Hay manera limpia de contar con esta sintaxis para [] en lugar de los valores tradicionales Falsy?

+1

'[] 'es una matriz vacía,' {} 'es un objeto vacío. ¿Cuál quieres considerar falsy? ¿O son ambos? – Paulpro

+0

Lo sentimos, matriz vacía '[]'. Voy a editar mi pregunta. – Randomblue

+0

También más información sobre la función f sería útil. Por ejemplo, si siempre devuelve una matriz, podrías hacer 'f(). Length || g() '. Que ejecutará g si la longitud de la matriz es faly (0 elementos) – Paulpro

Respuesta

5

Se podría escribir una función que convierte la matriz vacía en un valor Falsy reales, tal vez?

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

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

+1 Es una buena solución – Paulpro

+0

Excepto que necesita cambiar su función 'e' Devolverá falsy para cualquier matriz que no sea verdadera (o cualquier cosa sin una propiedad de longitud). Cambie a: 'function e (a) {return typeof a.length === 'number' &&! A.length? falso: a; } ' – Paulpro

+0

+1 muy inteligente. – jondavidjohn

0

¿Por qué no simplemente hacer la verificación de longitud en f()?

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

El problema con las otras soluciones presentadas es que no se comporta exactamente como se desea que funcione el cortocircuito. Por ejemplo, convertir el valor de f() a un valor Truthy antes del operador || significa que usted pierde la capacidad de devolver el resultado de f(). Así que aquí está mi solución preferida: escriba una función que se comporte como el operador ||.

// 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; 
} 

Ahora podemos utilizar la función either() como la forma en que lo haría el operador ||:

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

Si estás hablando realmente sobrecargar el || operador, no puede hacer eso en JavaScript (fue proposed back in ECMAScript 4 pero se rechazó). Si realmente quiere hacer la sobrecarga de operadores en JavaScript, usted tendría que usar algo como JavaScript Shaper, que es "un marco extensible para la conformación de JavaScript árbol de sintaxis" - en realidad se podría use this to overload operators.