Почему этот метод возвращает неопределенный, а не логический? - PullRequest
0 голосов
/ 01 марта 2019

У меня есть следующий метод

const isPrivate = (input) => {
  return input && input.type && input.type === "private";
}

console.log(isPrivate());

Почему возвращается неопределенное значение, а не логическое значение?

Ответы [ 3 ]

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

Логические операторы не приводят и не возвращают логические значения.

!!input гарантируют, что ввод является истинным значением, и возвращают логическое значение.input.type === "private" также возвращает логическое значение.Поскольку обе стороны оператора оценивают как логические значения, вы получите ожидаемое значение.

const isPrivate = (input) => {
  return !!input && input.type === "private";
}

console.log(isPrivate());
console.log(isPrivate({}));
console.log(isPrivate(''));
console.log(isPrivate({ type: 'public' }));
console.log(isPrivate({ type: 'private' }));
0 голосов
/ 01 марта 2019

Принудительное приведение оценки существования входных данных для логического значения не гарантируется.Тест на существование явно.Это также проясняет цель оценки.Кроме того, используйте интерпретатор для проверки ошибок намерений, изменив порядок операндов сравнения для оператора ===.Сравнивая input.type с литералом "private", интерпретатор не допустит скольжения ошибки ["private" = input.type], но с [input.type = "private"] все будет в порядке.Наконец, использование скобок для повышения значимости разграничения фраз очень мало.

const isPrivate = (input) => {return ("undefined"! == typeof input) && ("undefined"!== typeof input.type) && ("private" === input.type);};

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

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

Если вы хотите сначала протестировать неопределенное значение, измените его на

return input != null && input && input.type && input.type === "private";

Таким образом, он проверит, является ли он нулевым первым, и если он действителен, будет оценен как true и перейдет кследующий расчет.

...