Это всегда достаточно, чтобы использовать! получить правильное логическое значение в Javascript - PullRequest
0 голосов
/ 22 марта 2019

Я рассматривал случай, который выглядит следующим образом:

loggedInUser$ = this.select().pipe(
    filter(({ user }) => toBoolean(user)),
    map(({ user: { firstName: f, lastName: l } }) => `${f} ${l}`)
);

Просто любопытно, можем ли мы всегда заменить !! вместо этого метода, чтобы получить логическое значение и нет. IIUC семантика всегда будет одинаковой?

Другими словами, мы всегда должны иметь возможность заменить toBoolean(...) на !!?

Реализация выглядит так:

// @internal
export function toBoolean(value: any): boolean 
{
  return value != null && `${value}` !== 'false';
}

Анализ

Таким образом, исходя из ответов, разница в том, что !! возвращает true для «false», но toBoolean() возвращает false для «false».

Это немного субъективно, но лично я чувствую, что лучше сказать пользователям использовать !!, чем какой-либо другой подход с сахаром, так как сначала мы должны быть знакомы с основами / семантикой Javascript, а затем основываться на них.

Таким образом, если кто-то хочет, чтобы 'false' было ложным, он должен реализовать это явно. Применение в этом случае будет таким, что чье-то имя на самом деле является «ложным», и мы хотим, чтобы это было правдой.

Ответы [ 2 ]

3 голосов
/ 22 марта 2019

Нет, ваши toBoolean и !! не являются семантически эквивалентными.toBoolean зависит от сериализации строк, что является довольно странным способом приведения значения к логическому значению.Вот несколько значений, которые приводят к разным результатам:

toBoolean(0) == true
toBoolean('false') == false
toBoolean('') == true
toBoolean({toString(){return "false"}}) == false
2 голосов
/ 22 марта 2019

Нет, !! не эквивалентно toBoolean.

Чтобы объяснить немного подробнее, !! всегда будет возвращать логическое значение MDN , даже если есть примечание об использовании !!:

ItМожно использовать несколько операторов NOT последовательно для явного принудительного преобразования любого значения в соответствующий логический примитив.Преобразование основано на «истинности» или «ложности» значения (см. «Истина и ложь»).

Такое же преобразование можно выполнить с помощью функции Boolean.

Таким образом, вы всегда можете заменить Boolean(x) на !!x, но как насчет toBoolean?Обратите внимание, что toBoolean преобразует свой параметр в строку и сравнивает его со строкой 'false', поэтому есть по крайней мере один случай, когда он не совпадает:

function toBoolean(value: any): boolean 
{
  return value != null && `${value}` !== 'false';
}

console.log(Boolean('false'))
console.log(toBoolean('false'))

И показать более тонкий вопрос:

function toBoolean(value: any): boolean 
{
  return value != null && `${value}` !== 'false';
}

const foo = { toString: () => 'false' };

console.log(Boolean(foo))
console.log(toBoolean(foo))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...