让f
和g
成为两个功能。然后f() || g()
首先评估f
。如果f
的返回值为假,则会评估g
,并返回g
的返回值。
我喜欢简洁明了的语法,但它不包括f
返回空数组[]
的情况,我想将其视为“假”。
对于[]
而不是传统的假值,是否有这种语法的干净方式?
答案 0 :(得分:5)
您可以编写一个函数将空数组转换为实际的假值,可能吗?
function e(a) { return a instanceof Array ? (a.length ? a : false) : a; }
var result = e(f()) || g();
答案 1 :(得分:1)
所提出的其他解决方案的问题在于它并不能完全表现出您希望短路工作的方式。例如,在f()
运算符之前将||
的值转换为truthy值意味着您将失去返回f()
结果的能力。所以这是我的首选解决方案:编写一个与||
运算符类似的函数。
// 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;
}
我们现在可以使用either()
函数,就像||
运算符一样:
either(f(), g());
答案 2 :(得分:0)
为什么不在f()
进行长度检查?
function f(){
var returned_array = new Array();
...
if(!returned_array.length)
return false;
}
答案 3 :(得分:0)
如果您正在谈论实际超载||运算符,你不能在JavaScript中这样做(它是proposed back in ECMAScript 4但被拒绝)。如果你真的想在JavaScript中进行运算符重载,你必须使用类似JavaScript Shaper的东西,它是“JavaScript语法树形成的可扩展框架” - 你实际上可以use this to overload operators。