前者: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");}
添加回答
举报
0/150
提交
取消