Что делает оператор !! (двойной восклицательный знак) в 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, имея её имя в виде строки
В чем разница между String.slice и String.substring?