В чем разница между этими двумя утверждениями? - PullRequest
0 голосов
/ 23 сентября 2019

В чем разница между:

if(codons[i] == "UCU" || codons[i] ==  "UCC"|| codons[i] ==  "UCA"|| codons[i] ==  "UCG")

и:

if(codons[i] == "UCU" || "UCC"|| "UCA"||"UCG")

Какая логика лежит в основе интерпретации каждого из этих утверждений?И есть ли способ написать выражение if, если условие = 1, 2, 3 или 4, без повторения кодонов [i] == каждый раз?

Ответы [ 6 ]

1 голос
/ 23 сентября 2019

С точки зрения непрофессионала, в отличие от людей, субъект должен всегда повторяться при каждом условии, когда разговаривает с компьютерами.

Человеку вы можете сказать: «Возьмите все шары из этой коробки, где цветсиний, зеленый, красный или желтый "

Вот как вы говорите это компьютеру:

if (color == "blue" || color == "green" || color == "red" || color == "yellow") {
    // Add ball to basket
}

И любое ненулевое значение (конечно, кроме false) оценивается какtrue в условном выражении.

Итак:

if (color == "blue" || "green" || "red" || "yellow") {

}

совпадает с

if (color == "blue" || true || true || true) {

}
1 голос
/ 23 сентября 2019

Визуализация того, что происходит, может помочь с точки зрения понимания приоритета:

Второй оценивается так:

if ((codons[i] == "UCU") || ("UCC")|| ("UCA") || ("UCG"))

В любом случае, если codons[i] не равно "UCU", остановится вторая проверка условия "UCC", потому что любая строка длиной более 0 всегда верна.

Если вы хотите проверить несколько условий без необходимости писать codons[i] каждый раз, есть несколько способов сделать это.


Первый способ, достаточно хороший для проверки ограниченного числа значений: массивы!

// somewhere before the loop
var allowedValues = ['UCU', 'UCC', 'UCA', 'UCG'];
// ...
// somewhere within the loop
if (allowedValues.indexOf(codons[i]) != -1) {
    // codons[i] matches one of the values!
}

Теперь, только если вы планируете использовать эту функцию с большим количеством значений - скажем, миллион, для ясности.Возможно, вы захотите подумать об улучшении производительности, потому что для каждой итерации вашего цикла он потенциально будет повторяться миллион раз, чтобы найти одно значение.

Конечно, в обоих случаях потребуется много места в памяти (с массивом или с этим решением) ... Во всяком случае, это о литералах объекта.

// somewhere before your loop
var allowedValues = {
    UCU: null,
    UCC: null,
    UCA: null,
    UCG: null,
    // a lot more values...
};

// somewhere inside your loop
if (allowedValues.hasOwnProperty(codons[i])) {
    // codons[i] exists!
}

Обратите внимание, что все значения, которые нас интересуют в объекте, являются только ключами ,Я установил значения на null, но вы могли бы установить его на что-нибудь еще.В идеале наименьший возможный размер значения, но если он понадобится вам для чего-то еще позже в вашем коде, вы можете полностью использовать эту структуру!

0 голосов
/ 23 сентября 2019

Итак, вы спросили

Можно ли написать выражение if, если условие = 1 или 2, 3 или 4, без повторения кодонов [i] == каждый раз?

Да:

if (["UCU","UCC","UCA","UCG"].indexOf(codons[i]) !=-1) ...
0 голосов
/ 23 сентября 2019

Теперь я понял, спасибо, что ответили.Это была концепция, которую я не понял.

По сути, вы читали ||таким образом:

Если условие 1 ИЛИ (||) условие 2 ИЛИ условие 3.

Я читал это так:

если условие = 1 ИЛИ ИЛИ 3

0 голосов
/ 23 сентября 2019

Первое утверждение очевидно.

Если codons[i] == "UCU" or codons[i] == "UCC" or ...., тогда что-то сделать.

Второе утверждение означает, что если condition = false then do something.Например, если codons[i] == "UCU" || "UCC" означает, что condons [i] равен «UCU», возвращает «UCC».Цепочка || вернет последнее значение, которое следует за последним ложным утверждением.

5 === 2 || 3 > 10 || 'some text' вернет some text

5 === 2 || 3 > 10 || 'some text' || 'more text' также вернет some text, потому что 'некоторыеусловие text 'оценивается как истинное, поэтому more text не будет отображаться

, если вы напишите 5 === 2 || 3 > 10 || 'some text' && 'more text', вернется more text

Так что это цепочка условий, как и первое, нов этом случае оценивает, являются ли условия ложными.Один за другим.Но проблема в вашем случае в том, что при вычислении строки в виде 'UCU' всегда будет возвращаться true

console.log(5 === 2 || 3 > 10 || 'some text')
console.log(5 === 2 || 3 > 10 || 'some text' || 'more text' )
console.log(5 === 2 || 3 > 10 || 'some text' && 'more text')
0 голосов
/ 23 сентября 2019

Оба являются различными утверждениями.

Второй всегда будет истинным, поскольку другие аргументы, кроме codons[i] == "UCU", являются строковыми.

Проверьте это:

if((codons[i] == "UCU") || "UCC"|| "UCA"||"UCG")//it will be always true

Потому что

if("UCU"){
  console.log(true);
} 

всегда будет истинным.

Попробуйте это:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...