为了账号安全,请及时绑定邮箱和手机立即绑定

这两段js的写法是否完全等价?

这两段js的写法是否完全等价?

米脂 2019-04-08 11:16:49
前者:greeting="hello"+(username?username:"friend")后者:greeting="hello"+(username||"friend")下面有个回答明显对js的逻辑或操作符没有理解到位,我简单解释一下username||"friend"其中username是个标识符,可能这个变量已经定义,也可能没有定义。逻辑或操作符的操作数可以为任意类型,并且不一定总是返回boolean类型,且两个操作数的值不一定全部被计算,如果左操作数为真,则直接返回左操作数的值,注意,不是返回true,而是左操作数的值,也就是说4||0返回的是4,而不是true,这种情况下右操作数将直接被忽略。如果左操作数为假,则直接返回右操作数的值,例如0||"helloworld"将会返回"helloworld"
查看完整描述

2 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

可以从编译器性能优化的角度来看。
在诸如C、C++、java的语言里面,形如a||b的结构,a做真值判断结果为true的时候,没有必要做b的真值判断,因为根据操作符“或”的定义,只要二者有一个为真即可。因此在a真值判断结果为true的时候,编译器不需要计算b的值,按相应语言标准,返回a或者true。
在javascript这个语言里,“或”操作符并不一定返回boolean类型的值。上面的编译优化方式依然成立的,对于形如a||b的结构,编译器有以下的步骤:
首先判断a的真值,看其是否为“falsy”(“falsy”,即一个值为false、0、""(即空字符串),null,undefined,NaN之一的时候)
在a为非“falsy”的时候,不计算b,直接返回a(编译优化)
在a为“falsy”的时候,由于js的或表达式不需要返回boolean类型的值,略去b的真值判断。又因为b的值直接反映了false||b表达式的值,直接返回b
正因此,这两段js的写法完全等价。
更多类似的js写法,还有:
window.console&&window.console.log("helloworld");
等同于
if(window.console){
window.console.log("helloworld");
}
                            
查看完整回答
反对 回复 2019-04-08
  • 2 回答
  • 0 关注
  • 497 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号