Что делает оператор !! (двойной восклицательный знак) в JavaScript?
Я увидел следующий код:
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
Похоже, что в этом коде используется оператор !!, который я не узнаю. Что он означает?
5 ответ(ов)
Эта конструкция преобразует Object в boolean. Если объект имеет значение "ложь" (например, 0, null, undefined и т.д.), результат будет false, иначе - true.
!object // Инвертированный булевый результат
!!object // Неневерсиюемый булевый результат, возвращающий true
Таким образом, !! — это не оператор; это просто двойное применение оператора !.
Вообще говоря, проще использовать:
Boolean(object) // Преобразует в булевое значение
Реальный пример "Проверка версии IE":
const isIE8 = !!navigator.userAgent.match(/MSIE 8.0/);
console.log(isIE8); // Возвращает true или false
Если вы выполните:
console.log(navigator.userAgent.match(/MSIE 8.0/));
// Возвращает либо массив, либо null
Но если вы выполните:
console.log(!!navigator.userAgent.match(/MSIE 8.0/));
// Возвращает либо true, либо false
Это ужасно непонятный способ выполнения преобразования типов.
! означает НЕ. Таким образом, !true — это false, а !false — это true. Аналогично, !0 — это true, а !1 — это false.
Вы преобразуете значение в Boolean, инвертируете его, а затем снова инвертируете.
// Максимальная неясность:
val.enabled = !!userId;
// Частичная неясность:
val.enabled = (userId != 0) ? true : false;
// И, наконец, гораздо понятнее:
val.enabled = (userId != 0);
// Или просто
val.enabled = Boolean(userId);
Замечание: средние два выражения не совсем эквивалентны первому выражению в некоторых крайних случаях (например, когда userId — это []), из-за особенностей работы оператора != и того, какие значения считаются истинными.
!!foo применяет унарный оператор не дважды и используется для приведения значения к логическому типу, аналогично тому, как унарный плюс +foo приводит к числовому типу, а конкатенация с пустой строкой ''+foo приводит к строковому типу.
Вместо этих приемов вы также можете использовать функции-конструкторы, соответствующие примитивным типам (без использования new), для явного приведения значений, то есть:
Boolean(foo) === !!foo
Number(foo) === +foo
String(foo) === ''+foo
Таким образом, использование этих функций делает код более читаемым и понятным для других разработчиков.
Это просто логический оператор NOT, применённый дважды. Он используется для преобразования значения в булевый тип. Например:
true === !!10
false === !!0
Первое выражение возвращает true, потому что ненулевое число (в данном случае 10) преобразуется в true. Второе выражение возвращает false, так как ноль преобразуется в false.
Это преобразует суффикс в логическое значение.
Существует ли оператор "объединения с нулем" в JavaScript?
JavaScript: Знак плюс перед функциональным выражением
Где найти документацию по форматированию даты в JavaScript?
Как проверить, содержит ли массив строку в TypeScript?
Ссылка и выполнение внешнего JavaScript-файла, размещенного на GitHub