Зачем использовать!! принудить переменную к boolean для использования в условном выражении?
!!x
принуждает тип переменной x
к булевому, сохраняя при этом свою правдоподобие или недостаток - см. этот вопрос - у меня есть вопрос о использование этого в условных выражениях.
Несколько раз в JS-коде я видел !!
, используемый для принуждения переменной к логическому типу в условии if
, например,
if(!!x) {
x.doStuff();
}
Если идея состоит в том, чтобы проверить, существует ли x
до вызова методов на ней.
Но в моем собственном коде я всегда использовал
if(x) {
x.doStuff();
}
В предположении, что если x
определено, условие будет проходить, а если x
- undefined, оно не пройдет.
Итак, мой вопрос какова точка принуждения x
к логическому с помощью !!
в этом сценарии? Что делает этот код делает это этот код не работает?
Я предполагаю, что другие программисты не просто используют его, потому что он выглядит круто, поэтому либо это, либо одно из моих других допущений неверно: -)
Ответы
Ответ 1
В этом конкретном контексте я бы сказал, что нет никакой разницы между явным преобразованием в boolean с помощью !!
или пусть выражение if будет преобразовано в логическое, естественно. Я имею в виду, что if (x)
будет интерпретироваться как if (Boolean(x))
, что совпадает с if (!!x)
.
Однако, если вы возвращаете значение из функции, например, если вы хотите реализовать функцию arrayHasItems
, вы можете реализовать ее следующим образом:
function arrayHasItems(arr) {
return arr.length;
}
Использование функции в выражении if as is будет работать, потому что числовое значение, возвращаемое функцией, будет преобразовано в булево значение. Однако клиентский код ожидает, что функция вернет логическое значение, поэтому он может проверить условие, выполнив:
if (arrayHasItems(arr) === true) {}
В этом случае он потерпит неудачу, потому что возвращаемый результат из arrayHasItems
был числом.
Поэтому было бы лучше реализовать функцию, возвращая логическое значение, подобное ожидаемому.
function arrayHasItems(arr) {
return !!arr.length;
}
EDIT:
Возникает новый вопрос: почему!! arr.length, а не просто arr.length > 0
В полученном результате нет никакой разницы между ними, и вы даже не сохраняете байты, так как оба оператора принимают одинаковое количество символов. Однако я создал тестовый пример, и двойное отрицание, похоже, работает лучше, но может быть непротиворечивым во всех браузерах.
Ответ 2
Как указано, он преобразует значение в логическое значение и поэтому не сильно отличается от if(x)
. Однако оба они сложны, так как они также преобразуют 0
в false
и другие подобные вещи.
Ответ 3
Это связано с коверцией типа JavaScript.
Часто вы хотите проверить, не является ли объект не нулевым, а не undefined, а не 0 и т.д. Общим способом проверки этого является
if (obj) {
...
}
Однако, если вы хотите, чтобы условие было равно true
или false
, !
можно использовать для экземпляров небулевых объектов. Вот пример, в котором используется оператор равенства ===
, который не выполняет операции типа.
var obj = {};
console.log(obj === true); // returns false
console.log(!obj === false); // returns true
console.log(!!obj === true); // returns true