'&&' и '||'против?:» - PullRequest
       50

'&&' и '||'против?:»

5 голосов
/ 21 августа 2011

Почему вы используете этот синтаксис?

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

вместо

var myVar = myArray.length ? myArray : myObject;

Редактировать: у меня просто возникла мысль, что если в случае синтаксиса && || обе стороны|| оценивается как ложное, как вы могли ожидать, если myObject было undefined или null, если было бы возвращено ложное значение.Но это не так, возвращается значение объекта undefined или null.

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

Edit2:

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

Однако это возвращает false, если myObject равно undefined или null

Ответы [ 4 ]

4 голосов
/ 21 августа 2011

x && y || z отличается от x ? y : z, даже если оно «работает» в представленном случае.

Рассмотрим, когда y оценивается как ложное значение (в сообщении y не может быть ложным значением, когда оно оценивается, поскольку оно зависит от x и, таким образом, оно "работает", как и ожидалось) .

Использование ?: - гораздо лучшая и более понятная конструкция в этом случае. Единственная причина, по которой я могу использовать другой синтаксис, - «слишком много умов».

3 голосов
/ 21 августа 2011

Тройной это единственно правильное действие, если вы не гарантируете, что myObject.name имеет "истинное" значение.

Рассмотрим

res = a ? b : c;

против

res = a && b || c;

В чем разница? Первый делает то, что должен. Но вторые тесты a. Если a равно false, он получает c в качестве троичной версии.

Но если a истинно, он получает b, только если это также верно, если нет, он получает c, что вообще не нужно.

1 голос
/ 21 августа 2011

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 голос
/ 21 августа 2011

Вкусы различаются.Может быть, кто-то просто привык писать такие вещи, как

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

, и придерживался этого, даже когда троичный тоже подойдет.

...