Операторы 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
.
Последняя версия SSDT - 15.9, возможно, обновление разрешится? Однако поддержка SQL Server 2012 была временно удалена в версии 15,8.
Это версия Visual Studio, которую вы используете. Чтобы получить правильную версию SSDT, вам нужно перейти в раздел «О программе» или «Установка и удаление программ» и получить ее для SSDT.
В любом случае, проблема в том, что Microsoft удалила Targeting to SQL Server 2012 в SSDT версии 15.8.1 и впоследствии повторно добавила его в SSDT версии 15.9.0 (то есть самое последнее на момент публикации).
Просто обновите SSDT, и он у вас будет.
Примечание: Удалите SSRS и SSAS, если они установлены, в противном случае обновление SSDT завершится неудачно, и у вас будет много изжоги, когда он будет снова установлен.
журнал изменений предназначен для инструментов данных SQL Server (SSDT)