Почему это всегда возвращает истину? - PullRequest
2 голосов
/ 30 мая 2019

Вопрос для начинающих, извините, если это не то место, чтобы спросить Пытаясь понять, как логика работает в JS, не могу понять это

if (firstSymbol === "A" || "a" || "D" || "d") {
    if (secondSymbol === "z") {
        alert("It does!"); 
        break;
    }
}

Я ожидаю, что это скажет "Это делает!" и ломается в случае, если firstSymbol - это A, a, D или d И secondSymbol - это z, но по какой-то причине он говорит: «Да!» и прерывается независимо от того, что является firstSymbol, и проверяет, является ли secondSymbol z.

Ответы [ 5 ]

2 голосов
/ 30 мая 2019

Поскольку вы проверяете, является ли "a" истинным - это всегда верно:

console.log(!!"a");

Вы должны использовать includes и AND && в этом случае:

const firstSymbol = "D";
const secondSymbol = "z";
if (["A", "a", "D", "d"].includes(firstSymbol) && secondSymbol == "z") {
  console.log("It does!");
}
1 голос
/ 30 мая 2019

В Javascript есть нечто, называемое truthy и falsy значениями.В итоге, как значение оценивается в логическом (true или false) контексте.

Все значения являются достоверными, если они не определены как ложные (т. Е., Кроме false, 0,"", null, undefined и NaN).

В вашем коде, когда вы написали:

if (firstSymbol === "A" || "a" || "D" || "d")

Вы проверяете 4 логических условия:

  1. firstSymbol === "A" - Результат будет зависеть от firstSymbol
  2. "a" - Всегда будет оцениваться до true
  3. "D" - Всегда будет оцениваться до true
  4. "d" - всегда будет иметь значение true

Итак, поскольку условия 2, 3 и 4 всегда будут true, ваш код всегда будет вводить ifзаявление.Если хотя бы один из них будет true, поведение будет таким же.

Вы можете переписать его несколькими способами:

if (firstSymbol === "A" || firstSymbol === "a" || firstSymbol === "D" || firstSymbol === "d")

или

if (["A", "a", "D", "d"].indexOf(firstSymbol) > -1)

или

if (["A", "D"].indexOf(firstSymbol.toUpperCase()) > -1)
1 голос
/ 30 мая 2019

function matchSecondSymbol(firstSymbol, secondSymbol) {
  // By making FirstSymbol Uppercase, we can remove the other two conditions
  firstSymbol = firstSymbol.toUpperCase();
  if (['A', 'D'].includes(firstSymbol) && secondSymbol === "z") {
      console.log('it Does');
  }
  else {
      console.log('it does not');
  }
}

matchSecondSymbol('a', 'z');
matchSecondSymbol('z', 'z');
matchSecondSymbol('a', 'y');
0 голосов
/ 30 мая 2019

Порядок приоритета решает

На каждом языке программирования символы обрабатываются в порядке их приоритета.

Вкратце:

Как уже объяснили другие, ваше назначение

firstSymbol === "A" || "a" || "D" || "d"

будет обработано как

(firstSymbol === "A") || ("a") || ("D") || ("d")

Ссылка на логические операторыобрабатываются: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

0 голосов
/ 30 мая 2019

Просто добавьте что-то к шаблону, вот несколько примеров, чтобы выполнить то, что вы пытаетесь сделать, с кучей возможностей.

Покрытые тесты:

  • с использованием array.includes
  • с использованием array.indexOf
  • с использованием array.find
  • с использованием array.some

ПОЧЕМУ ваш код не работал?

Это не сработало, потому что javascript оценивает следующее выражение: "A" || "a" || "D" || "d" до "A", потому что "A" это truey . Если вам нужно сравнить с несколькими значениями, либо используйте массив, либо напишите условие для каждого из них: firstSymbol === "A" || firstSymbol === "D" ||...

Примеры, упомянутые выше:

/* Original code */
/*
if (firstSymbol === "A" || "a" || "D" || "d") {if (secondSymbol === "z") alert("It does!"); break;}
*/

let firstSymbol = "d", secondSymbol = "z";

// Using .includes
if (["A","a","D","d"].includes(firstSymbol) && secondSymbol === "z") console.log('it does, with .includes');

// Cleverer .includes due to the nature of the input.
if (["a","d"].includes(firstSymbol.toLowerCase()) && secondSymbol === "z") console.log('it does, with cleverer .includes');

// Using .indexOf
if (["A","a","D","d"].indexOf(firstSymbol) > -1 && secondSymbol === "z") console.log('it does, with .indexOf');

// Using .find
if (["A","a","D","d"].find(i => i === firstSymbol) && secondSymbol === "z") console.log('it does, with .find');

// Using. some
if (["A","a","D","d"].some(i => i === firstSymbol) && secondSymbol === "z") console.log('it does, with .some');
...