41

Что делает оператор !! (двойной восклицательный знак) в JavaScript?

38

Я увидел следующий код:

this.vertical = vertical !== undefined ? !!vertical : this.vertical;

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

5 ответ(ов)

37

Эта конструкция преобразует 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
10

Это ужасно непонятный способ выполнения преобразования типов.

! означает НЕ. Таким образом, !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 — это []), из-за особенностей работы оператора != и того, какие значения считаются истинными.

0

!!foo применяет унарный оператор не дважды и используется для приведения значения к логическому типу, аналогично тому, как унарный плюс +foo приводит к числовому типу, а конкатенация с пустой строкой ''+foo приводит к строковому типу.

Вместо этих приемов вы также можете использовать функции-конструкторы, соответствующие примитивным типам (без использования new), для явного приведения значений, то есть:

Boolean(foo) === !!foo
Number(foo)  === +foo
String(foo)  === ''+foo

Таким образом, использование этих функций делает код более читаемым и понятным для других разработчиков.

0

Это просто логический оператор NOT, применённый дважды. Он используется для преобразования значения в булевый тип. Например:

true === !!10

false === !!0

Первое выражение возвращает true, потому что ненулевое число (в данном случае 10) преобразуется в true. Второе выражение возвращает false, так как ноль преобразуется в false.

-1

Это преобразует суффикс в логическое значение.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь