Подтвердить что ты не робот

Использование тройного восклицательного знака

Просматривая исходный код одного из наших проектов, я нашел несколько мест, где мы используем три восклицательных знака в условных выражениях, например:

if (!!!someVar) {
    // ...
}

Теперь я понимаю, что это не какой-то редко используемый оператор, это всего три отрицания подряд, например !(!(!someVar))). Я не понимаю, как его использовать - на мой взгляд, его можно безопасно заменить единым восклицательным знаком. Ниже приводятся мои попытки найти случай, когда !!!a не равно !a (взято прямо с консоли Google Chrome):

var a = ''
""
!!!a === !a
true
a = 'string'
"string"
!!!a === !a
true
a = null
null
!!!a === !a
true
a = 12
12
!!!a === !a
true
a = {b: 1}
Object {b: 1}
!!!a.c === !a.c // a.c is undefined here
true
a = []
[]
!!!a === !a
true
a = [1,2]
[1, 2]
!!!a === !a
true

Я пропустил какой-то редкий (или очевидный) случай?

4b9b3361

Ответ 1

Нет разницы между !a и !!!a, так как !!!a является просто !!(!a) и потому что !a является логическим, !!(!a) является просто его двойным отрицанием, поэтому тот же.

Ответ 2

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

Ответ 3

Рассматривать:

var x;
console.log(x == false);
console.log(!x, !x == true);
console.log(!!x, !!x == true, !!x == false);  

... вывод консоли:

false 
true true 
false false true

обратите внимание на то, что, хотя x при первом использовании означает "фальси", это не то же самое, что false.

Но второе использование (! X) имеет фактическое логическое значение - но это противоположное значение.

Таким образом, третье использование (!! x) превращает значение "falsey" в истинное логическое значение.

... с учетом этого третий восклицательный знак делает ИСТИННОЕ отрицание исходного значения (отрицание "истинного логического" значения).

ETA:

О, МОЙ БОГ! Я не могу поверить, что я не заметил, что это вопрос восклицательного знака TRIPLE! Даже после того, как это было специально указано мне.

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

Ответ 4

Один восклицательный знак не всегда будет работать вместо тройного восклицательного знака.

Вот пример, когда один восклицательный знак не будет работать, в этом сценарии он как-то связан с функцией enqous() из пакета rlang. В приведенном ниже коде я пытался написать функцию "быстрой таблицы частот" (qft), чтобы вернуть результаты функции table() в виде отформатированного фрейма данных.

require(rlang)

qft1 <- function(data, ...){
  args <- enquos(...)
  vars <- select(data, !args)
  ft <- data.frame(table(vars))
  ft[ft$Freq != 0, ]
}

qft3 <- function(data, ...){
  args <- enquos(...)
  vars <- select(data, !!!args)
  ft <- data.frame(table(vars))
  ft[ft$Freq != 0, ]
}

data(mtcars)
qft1(mtcars, gear,cyl)
qft3(mtcars, gear,cyl)

Извините, я не могу уточнить детали, но вы заметите, что qft1(), определенный только с одним восклицательным знаком, не будет работать. Три восклицательных знака должны быть применены к аргументам, возвращаемым enqous().

Ответ 5

В javascript это способ показать, что то, что вы оцениваете, является не логическим, а правдивым или ложным.

Так что для истинных/ложных значений вы либо используете !! или !!!, а для логических !, либо ничего.

Это просто для удобства чтения.

Ответ 6

Первые двойные восклицательные знаки превратили в логическое значение любое ложное значение объекта (undefined, null, 0) или любое правдивое значение, а затем третье отрицает его.

Ответ 7

Кроме того, он нравится exit, когда вы используете его в консоли.