'&&'和'||'与'? :'的区别

5
为什么要使用这种语法?
var myVar = myArray.length && myArray || myObject;

替代

var myVar = myArray.length ? myArray : myObject;

编辑:我突然想到,如果在&& ||语法中,||两侧的内容都是false,就像当myObjectundefinednull时一样,返回的应该是false。但事实并非如此,会返回对象的值undefinednull

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

编辑2:

!!(myArray.length ? myArray : myObject);

然而,如果myObjectundefinednull,这将返回false。


4
因为有多种方法可以达到同样的目的。 - Matt Ball
1
个人而言,我会采用更为健壮的数组检查。例如,var myArray = []; 无法通过此测试... - anthony sottile
7
因为你希望每个人都浪费10-15秒钟的时间来弄清楚它到底是用来做什么的。 - Gabi Purcaru
1
可能是因为有人正在学习 &&||,还没有接触到 ? : - pimvdb
1
要将真值/假值转换为true/false,请使用!! expr。 - user166390
显示剩余5条评论
4个回答

4
x && y || zx ? y : z是不同的,即使在所示情况下它“工作”了。请考虑当y计算为false值时(在帖子中,当它依赖于x时,y不能被计算为false值,因此它按预期工作)。
在这种情况下,使用?:是更好、更清晰的构造方式。我能给出使用其他语法的唯一原因是“过于聪明”。

我同意你的结论,但是你说的“在帖子中y不能是一个假值,因为它依赖于x...”是什么意思?你是不是指在已知有一个数组的情况下,它不能是假的? - user113716
@patrick dw x 是 myArray.length,y 是 myArray。因此,如果 myArray.length 是 true-value,则 y永远不会是 false-value(myArray 将是 Array/Object,这不是 false-value,或者是非空字符串,这也不是 false-value)。这并不是那么依赖于某个条件,而是以一种非常特定的方式依赖于某个条件,就像这种情况一样。 - user166390
如果myArray.length是一个真值...好的,这对我来说更有意义。我所想的是不拒绝属性查找的“假值”。+1 :) - user113716

3

除非你保证myObject.name有一个"true"的值,否则三元操作符是唯一正确的选择。

考虑以下代码:

res = a ? b : c;

对比。

res = a && b || c;

有何不同呢?第一种情况做了它应该做的事情。但第二种情况测试了a。如果a为false,它会得到c,就像三元版本一样。

但是如果a为true,只有当b也为true时,它才会得到b,否则它会得到c,这完全不是想要的结果。


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

1

口味因人而异。也许有人习惯于写这样的东西

var myName = myObject && myObject.name || "unknown";

即使三元运算符也可以解决问题,但仍然坚持使用它。


这实际上是一个可能比 ?: 更好的情况。考虑当 myObject 是 "hello" 时,如果使用三元运算符,myName 应该是 "unknown"(如上所示)还是 undefined - user166390
这就是我的意思:在许多情况下,三元运算符缺乏您所需的功能。然后当它足够时,您已经不再习惯使用它了。 - Michael Lorton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接