Что !! (не нет) оператор в JavaScript? - PullRequest
2723 голосов
/ 24 апреля 2009

Я видел некоторый код, который, кажется, использует незнакомый оператор в виде двух восклицательных знаков, например: !!. Может кто-нибудь сказать, пожалуйста, что делает этот оператор?

Контекст, в котором я видел это, был

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

Ответы [ 35 ]

22 голосов
/ 23 марта 2011

Имитирует поведение функции приведения Boolean(). Первый NOT возвращает логическое значение независимо от того, какой операнд ему дан. Вторая NOT отрицает это Boolean значение и, таким образом, дает true логическое значение переменной Конечный результат такой же, как при использовании функции Boolean() для значения.

21 голосов
/ 24 апреля 2009

Кажется, что оператор !! приводит к двойному отрицанию.

var foo = "Hello World!";

!foo // Result: false
!!foo // Result: true
18 голосов
/ 10 сентября 2009

! is "boolean not", который по существу типизирует значение "enable" к его логическому противоположному значению. Второй ! переворачивает это значение. Итак, !!enable означает «не активирован», давая вам значение enable в качестве логического значения.

17 голосов
/ 25 мая 2016

Я думаю, стоит упомянуть, что условие, объединенное с логическим И / ИЛИ, не будет возвращать логическое значение, но последний успех или первый сбой в случае && и первый успех или последний провал в случае || цепочки условий.

res = (1 && 2); // res is 2
res = (true && alert) // res is function alert()
res = ('foo' || alert) // res is 'foo'

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

res = !!(1 && 2); // res is true
res = !!(true && alert) // res is true
res = !!('foo' || alert) // res is true
14 голосов
/ 09 апреля 2014

Конструкция !! - это простой способ превратить любое выражение JavaScript в его булев эквивалент

Например: !!"he shot me down" === true и !!0 === false.

12 голосов
/ 11 сентября 2009

Это не один оператор, это два. Это эквивалентно следующему и является быстрым способом приведения значения к логическому значению.

val.enabled = !(!enable);
9 голосов
/ 06 марта 2016

Операторы if и while и оператор ? используют значения истинности, чтобы определить, какую ветвь кода следует запустить. Например, нулевые и NaN числа и пустая строка являются ложными, но другие числа и строки являются истинными. Объекты имеют значение true, но неопределенное значение и null имеют значение false.

Оператор двойного отрицания !! вычисляет истинное значение значения. На самом деле это два оператора, где !!x означает !(!x) и ведет себя следующим образом:

  • Если x является ложным значением, !x равно true, а !!x равно false.
  • Если x - истинное значение, !x - false, а !!x - true.

При использовании на верхнем уровне логического контекста (if, while или ?) оператор !! по поведению является запретным. Например, if (x) и if (!!x) означают одно и то же.

Практическое использование

Однако он имеет несколько практических применений.

Одно из применений - это сжатие с потерями объекта до его истинного значения, чтобы ваш код не содержал ссылку на большой объект и не поддерживал его. Назначение переменной !!some_big_object вместо some_big_object позволяет ее использовать для сборщика мусора. Это полезно в случаях, когда создается либо объект, либо ложное значение, такое как null, или неопределенное значение, такое как обнаружение функции браузера.

Другое использование, о котором я упомянул в ответе о соответствующем операторе C !! , связано с инструментами "lint", которые ищут общие опечатки и диагностику печати. Например, как в C, так и в JavaScript несколько общих опечаток для логических операций приводят к другому поведению, вывод которого не совсем как логический:

  • if (a = b) - присвоение, за которым следует значение истинности b; if (a == b) - сравнение на равенство.
  • if (a & b) - побитовое И; if (a && b) - это логическое И. 2 & 5 - это 0 (ложное значение); 2 && 5 верно.

Оператор !! заверяет инструмент lint, что вы написали именно то, что вы имели в виду: выполните эту операцию, а затем получите истинное значение результата.

Третье применение - создание логического XOR и логического XNOR. И в C, и в JavaScript a && b выполняет логическое И (истина, если обе стороны верны), а a & b выполняет побитовое И. a || b выполняет логическое ИЛИ (true, если хотя бы одно из них истинно), а a | b выполняет побитовое ИЛИ. Существует побитовое XOR (исключающее ИЛИ) как a ^ b, но нет встроенного оператора для логического XOR (true, если истинна только одна сторона). Например, вы можете разрешить пользователю вводить текст точно в одно из двух полей. Что вы можете сделать, так это преобразовать каждое значение в истинное и сравнить их: !!x !== !!y.

9 голосов
/ 24 июня 2017

!! он использует NOT операцию дважды вместе, ! преобразует значение в boolean и переверните его, вот простой пример, чтобы увидеть, как !! работает:

Сначала у вас есть место:

var zero = 0;

Затем вы делаете !0, оно будет преобразовано в логическое значение и будет оценено как true, потому что 0 равно falsy, поэтому вы получите обратное значение и преобразовано в логическое значение, поэтому оно будет оценено как true .

!zero; //true

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

По сути, !! убедитесь, что мы получаем логическое значение, а не ложное, правдивое или строковое и т. Д. *

Так что это похоже на использование функции Boolean в javascript, но простой и короткий способ преобразования значения в логическое значение:

var zero = 0;
!!zero; //false
8 голосов
/ 24 апреля 2009

Я подозреваю, что это остаток C ++, где люди переопределяют! оператор, но не оператор bool.

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

7 голосов
/ 02 декабря 2010

Двойное логическое отрицание. Часто используется для проверки, не является ли значение неопределенным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...