Скорость BLE с разными версиями Android

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

Оператор двойного отрицания !! вычисляет значение истины значения. На самом деле это два оператора, где !!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 несколько общих опечаток для булевых операций производят другие поведения, выход которых не совсем как Boolean:

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

0
задан gcb 22 February 2015 в 15:35
поделиться