Ответ 1
Нет разницы между !a
и !!!a
, так как !!!a
является просто !!(!a)
и потому что !a
является логическим, !!(!a)
является просто его двойным отрицанием, поэтому тот же.
Просматривая исходный код одного из наших проектов, я нашел несколько мест, где мы используем три восклицательных знака в условных выражениях, например:
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
Я пропустил какой-то редкий (или очевидный) случай?
Нет разницы между !a
и !!!a
, так как !!!a
является просто !!(!a)
и потому что !a
является логическим, !!(!a)
является просто его двойным отрицанием, поэтому тот же.
Это то же самое, что и один восклицательный знак. Основная идея заключается в улучшении видимости для программиста. Компилятор будет оптимизировать его как одиночный '!' в любом случае.
Рассматривать:
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! Даже после того, как это было специально указано мне.
Так что, хотя мой ответ, надеюсь, кому-то пригодится, я должен согласиться с другими, которые опубликовали, что тройной восклицательный знак - это то же самое, что и одиночный.
Один восклицательный знак не всегда будет работать вместо тройного восклицательного знака.
Вот пример, когда один восклицательный знак не будет работать, в этом сценарии он как-то связан с функцией 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().
В javascript это способ показать, что то, что вы оцениваете, является не логическим, а правдивым или ложным.
Так что для истинных/ложных значений вы либо используете !!
или !!!
, а для логических !
, либо ничего.
Это просто для удобства чтения.
Первые двойные восклицательные знаки превратили в логическое значение любое ложное значение объекта (undefined, null, 0) или любое правдивое значение, а затем третье отрицает его.
Кроме того, он нравится exit
, когда вы используете его в консоли.