Разве не излишне использовать «!!» в операторе if, поскольку утверждения if уже проверяются на истинность?

#javascript #if-statement #type-coercion

Вопрос:

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

 var user = 'username123'

if (!!user) {
  // arbitrary code
}
 

Итак, я знаю, что использовал здесь строку, но на самом деле не должно иметь значения, какого типа переменная, потому что я исходил из предположения, что весь смысл использования !! заключается в том, чтобы обеспечить логический тип. Другими словами, !!user это просто другой способ действий Boolean(user) . После внимательного прочтения документов MDN If..else кажется довольно ясным, что if утверждения уже делают это. Почему же тогда существует необходимость во !! внутреннем if заявлении? Или я ошибаюсь и !! действительно преобразует значения в логический тип более точно или по-другому, чем принудительное приведение типа, выполненное if заявление? Или это один из тех случаев, когда я в основном прав, но есть исключения, когда преобразования приведут к различным логическим значениям?

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

1. Да, это излишне.

2. это просто код ниндзя, добавлено 2 символа вместо 9 ; в основном используется для троичных операторов, дьявола нет

3. Это избыточно до тех пор, пока вам явно не понадобится логическое значение, поэтому в единственном числе проверьте правдивость. Но есть сравнения, которые приведут к неожиданным результатам, если их явно не принудить, т. е. ([] == false) // -> true где как (!![] == false) //-> false

Ответ №1:

Да, это излишне. Условие if инструкции всегда принудительно приводится к логическому значению. То же самое относится и к троичным операторам.

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

1. Ладно, я так и думал. Спасибо. У меня есть еще один связанный с этим вопрос. Если вы используете тернарный оператор, например user ? true : false , это также приведет к тому же результату, !!user что и . Я думаю, мой вопрос в том, обеспечивает ли тернарный ? оператор также логический тип?

2. @privacyважный Да, это так.