Возможность объявить переменную из функции в операторе IF? - PullRequest
0 голосов
/ 24 марта 2019

Я снова вернулся.У меня возник маленький вопрос о возможности того, что я мог бы объявить переменную в условии IF из функции и использовать ее внутри самого оператора.

Хорошо, мне интересно посмотреть, есть ли способобъявить переменную внутри условия оператора IF и использовать ее далее вдоль инструкции следующим образом:

function SomeFunc() {return true}
if (let n = SomeFunc()) {
    console.log(n); // true
    // n is truthy
} else {
    // Would never run, because it always returns true.
    // This is just an example though, where it can return a truthy or falsy value dependent on the input context I could give it.
    console.log(n); // false (if it actually returned 'false')
    // n is falsy
}

Есть ли способ сделать это, не выполняя функцию дважды и не выполняя ее снаружиоператор IF?

(но не так):

let n = SomeFunc();
if (n) { ... } else { ... }

// Or this:
if (SomeFunc()) {
    let n = SomeFunc();
} else { ... }

Я бы хотел, чтобы внутри условия была объявлена ​​одна функция, чтобы минимизировать использование строки и иметь ее - для меня- чисто.Я надеюсь, что есть способ объявить переменную внутри условия IF.

Заранее спасибо.~ Q

Ответы [ 3 ]

2 голосов
/ 24 марта 2019

Синтаксис не позволяет let, const или var появляться в этой позиции.Но вы можете просто определить переменную (без инициализации) и затем сделать if:

let n;
if (n = SomeFunc()) {
    // n is truthy
} else {
    // n is falsy
}

Если вы хотите ограничить область действия этой переменной только этим if, то поместите ее вblock:

// other code...
{
    let n;
    if (n = SomeFunc()) {
        // n is truthy
    } else {
        // n is falsy
    }
}
// other code...

Конечно, если ваша функция не имеет другого кода, тогда дополнительный блок не требуется: блок функции будет применяться.

Многие не согласятся с вами, что назначение внутриif условие clean .Лучшая практика - избегать таких побочных эффектов в состоянии, хотя мнения по этому вопросу расходятся.Тем не менее, это не займет больше символов, чтобы написать это следующим образом, и это выглядит мне чище:

{
    let n = SomeFunc();
    if (n) {
        // n is truthy
    } else {
        // n is falsy
    }
}

В качестве выражения функции

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

(n => {
    if (n) {
        // n is truthy
    } else {
        // n is falsy
    }
})(SomeFunc());
0 голосов
/ 28 марта 2019

Ах!Я понял это несколько дней назад, но не успел ответить.Я мог бы использовать локальные переменные, которые я перезаписывал только при выполнении операторов.

Вот пример.

function retClone(bool) {
    return bool; // Returns same input context for example.
}

if (t = retClone(true)) {
    console.log(t); // true
    // t is truthy, because we get `true` returned.
}

if (t = retClone(false)) {
    // Wouldn't run.
    // t is falsy.
} else {
    console.log(t); // false
}

Спасибо всем, кто откликнулся.~ Q

0 голосов
/ 24 марта 2019

Тернарный оператор

Для краткого синтаксиса используйте троичный оператор:

var / const / let переменная = ( условие ) ? значение, если оно истинно : значение, если ложь

Круглые скобки, обернутые вокругусловия не являются обязательными.


Демо

/* 
Condition: if (number is greater than 10) ?
             return true 
           : else return false
*/
const gTTen = number => { return (number > 10) ? true : false; }

console.log(gTTen(11));
console.log(gTTen(9));

function ternary(number) {

  /*
  Using the previous function then store its return in a 
  variable
  */
  const tenFilter = gTTen(number);
  
  /*
  Condition: if (previous value is true AND the number is
             less than 20) ?
               range is 30
               : else range is 0
  */
  let range = (tenFilter && number < 20) ? 30 : 0; 
  
  /*
  Condition: if (range = 30) ? 
               result is (the first string)
               : else result is (the last string)
  */               
  let result = range === 30 ? `${number} is within range` : `${number} is not within range`;
  
  return result;
}

console.log(ternary(50));
console.log(ternary(15));
...