Машинопись: в чем разница между проверкой, пуста ли переменная, и проверкой, имеет ли она значение?

# #javascript #typescript #firebase #google-cloud-functions

Вопрос:

Я добавляю проверку в свой код и, чтобы улучшить читаемость, написал следующее:

   if (!uid) {
    return {result: 0, message: 'You are not authorized.'}
  }
 

Альтернативой было бы проверить, существует ли переменная:

   if (uid) {
    //do some code
  }
 

Однако, если у меня есть много разных переменных для проверки, мне не нравится, когда их нужно вкладывать таким образом:

   if (uid) {
     if (otherVar) {
        //do some code 
     } else {
        //else code 1
     }
  } else {
     //else code 2
  }
 

Есть ли какая-то разница в выполнении метода 1 по сравнению с методом 2?

Ответ №1:

Ответ:

  • Метод 1 проверяет только значение этой переменной. Если значение существует / равно true , то оно вернется true .
  • Метод 2 проверяет наличие переменных после завершения первой проверки, и он возвращается true .

Мое мнение, на самом деле вам не обязательно делать это так. Вместо этого вы можете использовать дополнительный оператор цепочки для выполнения безопасных проверок внутри объекта. Например:

 const adventurer = {
  name: 'Alice',
  cat: {
    name: 'Dinah'
  }
};

const dogName = adventurer.dog?.name; // notice the usage of '?'
console.log(dogName); // will return 'undefined' as 'dog' object does not exist in that object.
 

Цитирование документов MDN:

Оператор ?. функционирует аналогично оператору . оператор цепочки, за исключением того, что вместо того, чтобы вызывать ошибку, если ссылка является нулевой (нулевой или неопределенной), выражение замыкается с возвращаемым значением undefined. При использовании с вызовами функций он возвращает значение undefined, если данная функция не существует.

Оттуда вы можете использовать необязательную цепочку для упрощения вложенных блоков — например, с помощью глобального обработчика ошибок.

 const result = uid?.otherVar?; // imagine 'otherVar' does not exist!

if (!result) return handleResult();
 

Дальнейшее чтение: