为什么要使用这种语法?
var myVar = myArray.length && myArray || myObject;
而不是
var myVar = myArray.length ? myArray : myObject;
编辑:我只是想到如果在&& ||
语法的情况下,||
的两边都被评估为false,正如您可能期望myObject
{{1} }}或undefined
,如果返回false。但事实并非如此,会返回对象值null
或undefined
。
null
EDIT2:
true || true //true
true || false //true
false || true //true
false || false //false
如果!!(myArray.length ? myArray : myObject);
为myObject
或undefined
答案 0 :(得分:4)
x && y || z
与x ? 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