在之前的海外api项目中,对数组元素赋值时,使用的都是如下方式:
ad.os && ad.os[0] || Commons.getPlantform(ad.prev_url)
在这里使用js的短路运算构成了类似于三目运算的效果。
我一直以为这一点应该是放之四海而皆准吧.
于是在cpctest项目中封装了mongodb查询的函数,在处理回调函数时,使用了上述方式来判断查询结果的长度。
if (docs.length == 1) callback(docs[0]);
else callback(docs || []);
上面是原始的if else格式,当时写的时候就使用了开头提到的短路运算符格式:
docs.length==1 && callback(docs[0]) || callback(docs || [])
结果发现,有时候,两个函数都执行了!最后不得不修改成if else格式(或者使用三目运算符了!)
仔细再测试下js的短路运算就会发现,第二部分的返回结果转成布尔值将会影响函数的执行。函数的返回结果是0,或者没有,就等于布尔false!
true && func1 || func2
func1没有返回值时导致func1,func2都被执行了,因为只有执行到函数的最后一行才知道最终结果转为布尔值的结果。
正确的写法如下:
Judge && (func1 || 1) || func2
judge为false,则直接执行func2
judge为true,则 func1 || 1 得到执行机会,func1被执行,无论是否返回值,|| 1 后返回了1, && 运算返回了true,func2不会被执行!
2 && (b("aa") || 1) || a("baa")
(str) => { console.log(str); return 1;}
(str) => { console.warn(str);}