2018-10-06 js中短路运算出现的一次大意外!

2018-10-06  本文已影响19人  五大RobertWu伍洋

在之前的海外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);}

所以短路运算连接函数时,一定要注意使用这种特殊写法,或者确保函数有return语句。否则,请用if else或者 三目运算。

上一篇下一篇

猜你喜欢

热点阅读