Подтвердить что ты не робот

Зачем использовать!! принудить переменную к boolean для использования в условном выражении?

!!x принуждает тип переменной x к булевому, сохраняя при этом свою правдоподобие или недостаток - см. этот вопрос - у меня есть вопрос о использование этого в условных выражениях.

Несколько раз в JS-коде я видел !!, используемый для принуждения переменной к логическому типу в условии if, например,

if(!!x) {
    x.doStuff();
}

Если идея состоит в том, чтобы проверить, существует ли x до вызова методов на ней.

Но в моем собственном коде я всегда использовал

if(x) {
    x.doStuff();
}

В предположении, что если x определено, условие будет проходить, а если x - undefined, оно не пройдет.

Итак, мой вопрос какова точка принуждения x к логическому с помощью !! в этом сценарии? Что делает этот код делает это этот код не работает?

Я предполагаю, что другие программисты не просто используют его, потому что он выглядит круто, поэтому либо это, либо одно из моих других допущений неверно: -)

4b9b3361

Ответ 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