开发者

Extending the logical OR || syntax for the empty array

Let f and g be two function. Then f() || g() first evaluates f. If the return value of f is falsy it then evaluates g, and returns g's return value.

I love the neat and concise syntax, but it doesn't include the case where f returns the empty array [], which I want to开发者_运维问答 consider "falsy".

Is there clean way of having this syntax for [] instead of the traditional falsy values?


You could write a function that converts the empty array into a real falsy value, maybe?

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

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


The problem with the other solutions presented is that it doesn't behave exactly how you may want the short-circuiting to work. For example, converting the value of f() to a truthy value before the || operator means you lose the ability of returning the result of f(). So here's my preferred solution: write a function that behaves like the || operator.

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

We can now use the either() function like how we would the || operator:

either(f(), g());


Why not simply do the length check at f()?

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


If you're talking about actually overloading the || operator, you cannot do that in JavaScript (it was proposed back in ECMAScript 4 but rejected). If you really want to do operator overloading in JavaScript, you'd have to use something like JavaScript Shaper, which is "an extensible framework for JavaScript syntax tree shaping" - you could actually use this to overload operators.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜