2016-04-18 3 views
-2

я думал, что я должен был сделать это:Зачем использовать && вместо || в следующем выражении if?

if (building.floorplan || selectedCategory !== 'outdoor') { 
    // run code 
} 

(Выполнить код, если здание имеет план этажа или если выбранная категория не на улице.)

Но оказывается, код работает только с &&:

if (building.floorplan && selectedCategory !== 'outdoor') { 
    // run code 
} 

(Выполнить код, если здание имеет план и, если выбранная категория не на улице.)

Не должен ли первый код запускать код? Поскольку условие встречается, если есть план поэта, или выбранная категория не является наружной?

+3

Первая должна работать. Каков тип «.floorplan»? – Chris

+1

Первое утверждение будет выполняться, если одно из условий оценивается как true. Второй оператор будет выполняться, если оба условия оцениваются как true. Да, это означает, что первая всегда будет работать, если вторая работает. –

+4

Это два принципиально разных выражения. Поэтому без какого-либо дальнейшего контекста невозможно сказать, почему вам нужно было использовать один над другим. Но да, случай OR будет выполняться, когда выполняется сценарий AND, но он намного слабее, поэтому он также будет работать в случаях, когда сценарий AND не будет работать. – JustSid

ответ

4

Запустить код, если в здании имеется план этажа ИЛИ, если выбранная категория не является наружной.

Если вы используете оператор OR ||, то вы говорите, что если первый из них истинен, то нет необходимости смотреть вперёд.

Так,

if (building.floorplan || selectedCategory !== 'outdoor') { 
    // run code 
} 

не будет выходить за рамки первого условия, если building.floorplan не falsey.

С другой стороны, если вы используете и &&, то вы говорите, что если первый из них является ложным, то не нужно смотреть вперед

Так,

if (building.floorplan && selectedCategory !== 'outdoor') { 
    // run code 
} 

не будет выходить за рамки первой состояние если building.floorplan не правда.

Не должен ли первый случай также запускать код? Так как условие соответствует , если есть план площадки ИЛИ выбранная категория не является наружной?

Первый случай проверяет, есть ли floorplan, тогда нет необходимости искать следующее состояние. Итак, No - первое условие не будет работать, как описано выше.

1

Я подозреваю, что это связано с type, что .floorplan есть. Как упоминалось в ваших комментариях под вопросом, floorplan - это строка.

Тот факт, что он не может быть понят только из кода, говорит о том, что более выразительным кодом должен быть порядок дня. Будущее DEV будет трудно прийти, и на первый взгляд, понять, что представляет собой ложное значение - это "" или "no floorplan" или "ain't no body got a floorplan" и т.д.

Я хотел бы предложить что-то вроде:

if(build.floorplan !== "" || selectCategory !== "outdoor") {...} 

Истинное сравнение будет зависеть от контекста вашего конкретного приложения.

В качестве альтернативы, добавить метод к объекту сборки, что-то вроде hasFloor, что делает проверку, так что ваш метод может быть переписано в виде:

if(build.hasFloorplan() || selectCategory !== "outdoor") {...} 

Лично, если это не тип BOOL, я явно проверить в мои условия, особенно на языке, таком как JS.

0

Если вам нужно принять эти две переменные не равны на открытом воздухе сделать следующее:

if ((building.floorplan == selectedCategory) && (selectedCategory != 'outdoor')){ 
    //code goes here 
} 
Смежные вопросы