Почему полный логический оператор не требуется в операторе if?

#javascript #if-statement

#javascript #if-statement

Вопрос:

Мне интересно, почему «if (ethos [name])» уже достаточно? Потому что я бы написал if(name=ethos[имя]). Что это значит? Спасибо.

 var ethos = {
    achilles: "glory",
    aeneas: "duty",
    hades: null // Beyond human understanding
}

function printEthos (name) {
    if (ethos[name]) {
        console.log(ethos[name]);
    } else {
        console.log(name   " has no recorded ethos.");
    }
}```
  

Комментарии:

1. «Потому что я бы написал if(name=ethos[имя])» — что, скорее всего, не делает того, что вы думаете. = является оператором присваивания, == и === приведены для сравнения.

2. Тот факт, что ethos[name] содержит значение, приводит к тому, что условие if выполняется true . Если бы значение было null, пустой строкой или 0, это было бы false .

3. Это работает, потому что в JavaScript есть концепция истинных и ложных значений.

4. if(name=ethos[name]) возможно, проверяет ту же «истинность» значения, хранящегося в ethos[name] , но также присваивает значение name.

5. Спасибо, думаю, теперь я знаю, почему 🙂

Ответ №1:

JavaScript имеет 7 ложных значений 0 , 0n , null , undefined false , NaN '' ,, и пустую строку,,,,,,,,,,,,,,,. В вашем случае ваш if возвращает undefined одно из ложных значений, поэтому if (esthos[name]) этого достаточно для оценки ложного условия.

console.log(esthos[name]) //-> undefined

или, как сказал @Titulum…

console.log(!!esthos[name]) //-> false

Таким же образом вы можете проверить, пуст ли массив, только с помощью if(esthos.length) :

 const esthos = []

console.log(esthos.length) //-> 0 which is a falsy value
// or
console.log(!!esthos.length) //-> false

  

if (esthos.length) достаточно, потому что это вернет 0 одно из ложных значений в JavaScript или число, отличное от 0 , которое является истинным.

Комментарии:

1. Вы правы @pilchard, внесли исправление. Спасибо.

2. не беспокойтесь, вы были правы, этого if(esthos.length) достаточно, просто console.log(esthos.length) печатается 0 , даже если в if() операторе оно будет равно false.

Ответ №2:

if (esthos[name]) проверяет, является ethos[name] ли truthy значение, хранящееся в. Чтобы явно преобразовать его в a boolean , вы можете сделать if (!!esthos[name]) . Причина этого в том, что javascript использует значения truthy и falsy .

Вы можете прочитать больше об этом в этой статье.

Комментарии:

1. «Причина этого в том, что javascript использует истинные значения вместо реальных true и false» — Это неправда… Существуют значения, которые будут обрабатываться как true / false в определенных условиях при использовании в таком условии, как if (...)

2. » if (esthos[name]) проверяет, содержит ли переменная значение». — Это неправда. Значение в esthos[name] будет вычислено. Если esthos[name] это ложное значение, то оно все равно будет рассматриваться как false (или наоборот)

3. Обновил мой ответ, нет причин относиться к нему так враждебно.