'&安培;&安培;'和'||' vs'? :”

时间:2011-08-20 21:06:50

标签: javascript syntax ternary-operator

为什么要使用这种语法?

var myVar = myArray.length && myArray || myObject;

而不是

var myVar = myArray.length ? myArray : myObject;

编辑:我只是想到如果在&& ||语法的情况下,||的两边都被评估为false,正如您可能期望myObject {{1} }}或undefined,如果返回false。但事实并非如此,会返回对象值nullundefined

null

EDIT2:

true  ||  true      //true
true  ||  false     //true
false ||  true      //true
false ||  false     //false

如果!!(myArray.length ? myArray : myObject); myObjectundefined

,则会返回false

4 个答案:

答案 0 :(得分:4)

x && y || zx ? y : z不同,即使它在所提供的案例中“有效”。

考虑y何时评估为假值(在帖子中y在评估时不能是假值,因为它依赖于x因此它“按预期工作”。

在这种情况下,使用?:是更好,更清晰的构造。我可以给出使用其他语法的唯一原因是“太聪明”。

答案 1 :(得分:3)

除非您保证myObject.name具有“真实”值,否则三元组是唯一正确的做法。

考虑

res = a ? b : c;

VS

res = a && b || c;

有什么区别?第一个做它应该做的事情。但第二次测试a。如果a为false,则会获得c,作为三元版本。

但如果a为真,那么只有b如果这是真的,如果不是,它会得到c,根本不需要。

答案 2 :(得分:1)

口味各不相同。也许有人养成了写

之类的习惯
var myName = myObject && myObject.name || "unknown";
即使三元也能正常工作,也要坚持下去。

答案 3 :(得分:1)

http://jsperf.com/conditional-operators

当您希望代码变慢并希望对其进行多处混淆时,看起来您使用&& ||:)


正在发生的事情之间也存在差异。

foo && bar || foobar  // if foo or bar is false, then foobar will be returned
foo?bar:foobar        // the bar, or foobar, is decided solely on foo

如果您希望三元行为符合逻辑条件,那就是:

foo&&bar?bar:foobar
相关问题