Вам известен логический оператор NOT (!), который используется для отрицания выражения. В этой статье мы рассмотрим, что такое !!! (not not) оператор и его применение.
Истина и ложь
Прежде чем понять оператор not (!!), нам необходимо разобраться, что такое истинное и ложное значение в JavaScript. Истинное значение — это значение, которое считается истинным
в булевом контексте. То есть, если у нас есть выражение if("John")
или if(1)
, то оно будет считаться true
. Следовательно, непустая строка, ненулевое число и т.д. считаются истинными.
Аналогично, falsy — это некоторое значение, которое оценивается как false
. Примерами являются 0
, ''
""
, null
, undefined
и т.д.
Примеры истинности
Ниже приведены выражения, которые будут оцениваться как true
. Следовательно, все значения внутри условий if являются истинностными значениями.
if (true)
if ({})
if ([])
if (42)
if ("0")
if ("false")
if (new Date())
if (-42)
if (12n)
if (3.14)
if (-3.14)
if (Infinity)
if (-Infinity)
Примеры falsy
Следующие значения считаются ложными в JavaScript:
- false
- 0
- -0
- », «»
- null
- неопределенный
- NaN
Полный список можно найти здесь.
Использование оператора !!
Допустим, у нас есть функция getProductDetails
, которая возвращает данные о продукте, если передан правильный идентификатор продукта. При передаче недопустимого идентификатора товара она может вернуть пустую строку или undefined
. Таким образом, код для обработки сведений о товаре, полученных в качестве ответа, будет выглядеть следующим образом:
const product = getProductDetails(123)
if (product !== undefined || product !== "") {
// Process product details
}
С помощью оператора not not мы можем сократить это следующим образом:
const product = getProductDetails(123)
if (!!product) {
// Process product details
}
!!
— это не оператор, а два логических оператора NOT (!).
Первый из них (справа) преобразует операнд (оцениваемое значение) в отрицаемое булево, а второй ! снова отрицает булево значение, чтобы получить булево представление операнда.
То есть, !"John"
будет оценено как false
, а !false
будет оценено как true
.
В случае ложного значения, !0
будет оценено как true
, а !true
будет false
.
Интересно отметить, что !!new Boolean(false)
является true
, потому что new Boolean(false)
создаст объект, который является истинным, даже если он содержит ложное значение.