今天的课程是从一个bug中诞生的,有一段代码:constperson={name:'suyan',getName(){returnthis.name;}};functionisSuyan()if(person.name==='suyan'&&person.getName){returntrue;}returnfalse;}重构这段代码:functionisSuyan()returnperson.name==='suyan'&&person.getName;}执行下面的代码,结果是什么?letisTrue=isSuyan();控制台日志(是真);结果是一个函数,可能会让你和我大吃一惊:遇到问题,马上百度:看一个解释:逻辑运算符通常与布尔(逻辑)值一起使用。当它们是时,它们返回一个布尔值。但是,&&和||运算符实际上返回指定操作数之一的值,因此如果这些运算符与非布尔值一起使用,它们将返回非布尔值。含义:如果所有逻辑运算符都使用布尔值,则结果也是布尔值。但是,在&&和||中,当操作数是非布尔值时,结果可能是非布尔值。理解起来有点绕弯路,我们来看一个例子:&&运算符从左到右计算,如果为真,则继续往回走,直到遇到假,或者到达最后一个操作数。如果操作数是布尔值,则结果返回布尔值,如果操作数是非布尔值,则结果返回非布尔值。constc=1;console.log(a&&b);//-5console.log(a>0&&b);//-5console.log(a<0&&b);//falseconsole.log(a&&b<0);//trueconsole.log(a&&b>0);//falseconsole.log(a>0&&b<0);//trueconsole.log(a&&b&&c);//1||运算符,只要一个为真值就停止求值,结果的规则与&&运算符相同。console.log(a||b);//10console.log(a>0||b);//trueconsole.log(a<0||b);//-5console.log(a||b<0);//10console.log(a||b>0);//10console.log(a>0||b<0);//trueconsole.log(a||b||c);//10传播几个知识点:1.可以转为false的值:null、NaN、0、空串""、''、``、undefined。2、&&的优先级大于||。true||false&&false//返回true,因为&&先被执行(true||false)&&false//返回false,因为运算符优先级不能应用3.!and!!运算符返回的值永远是布尔值。上面的例子可以改成下面这样,返回值总是布尔值:functionisSuyan(){return!!(person.name==='suyan'&&person.getName);}4.Priority如果有Label显示用户名,显示规则为:默认值为前端类,如果用户定义了别名,则使用别名。如果用户定义了真实姓名,则使用真实姓名。优先级为真实姓名>昵称>默认姓名。我以前是这样写的:'前端小课';}returnshowName;}学完这节课,我就这样写了。两个函数的结果是一样的,但是代码量从15行减少到6行:functionshowName2(){letdefaultName='前端小类';lettrueName='真实姓名';letnickName='别名';returntrueName||nickName||defaultName;}本课程主要学习&&,||,!和!!在JavaScript中,如果使用不当,可能会导致bug。大家来吧!!!
