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

Когда использовать двойной (!!) оператор в JavaScript

Я понимаю то, что делает двойной оператор не в JavaScript. Мне интересно, как это использовать, и действительно ли последнее утверждение, которое я сделал, правильно.

Я сказал, что if (!!someVar) никогда не имеет смысла и не является (!!someVar && ..., потому что и теги if, и && будут вызывать someVar как логическое, так что!! является излишним.

Фактически, единственный раз, когда я мог думать о том, что было бы законно использовать double not operator, нужно ли строгое сравнение с другим логическим значением (так что, возможно, в возвращаемом значении, которое ожидает true или false явно).

Это правильно? Я начал сомневаться в себе, когда заметил, что jQuery 1.3.2 используется как if (!!someVar), так и return !!someVar && ...

Имеет ли двойник никакого фактического эффекта в этих ситуациях?

Мое личное мнение состоит в том, что это просто приводит к путанице. Если я вижу оператор if, я знаю, что он оценивает его как логическое.

4b9b3361

Ответ 1

В контексте if statement Я с вами, это абсолютно безопасно, потому что внутри, операция ToBoolean будет выполненное в выражении условия (см. шаг 3 в спецификации).

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

function isFoo () {
  return 0 && true;
}

console.log(isFoo()); // will show zero
typeof isFoo() == "number";

В заключение, Логические логические операторы могут возвращать операнд, а не результат Boolean обязательно:

Логический оператор И (&&) вернет значение второго операнда, если первое верно:

true && "foo"; // "foo"

И он вернет значение первого операнда, если он сам по себе является ложным:

NaN && "anything"; // NaN
0 && "anything"; // 0

С другой стороны, логический оператор OR (||) вернет значение второго операнда, если первая ложь:

false || "bar"; // "bar"

И он вернет значение первого операнда, если он сам по себе не является фальшивым:

"foo" || "anything"; // "foo"

Возможно, стоит упомянуть, что значения фальши: null, undefined, NaN, 0, строка нулевой длины и, конечно, false.

Все остальное (это не ложь, объект Boolean или значение Boolean), оцененный в логическом контексте, вернется true.

Ответ 2

Да,!! var используется, когда вы хотите вернуть 0 || 1.

Одно простое сравнение значений bool, когда вы хотите, чтобы "a == b" был эквивалентен "xor not b", кроме a = 5 и b = 7, оба были бы истинными, но не равными.

Другим является то, что вы хотите принудить набор условий к битам переменной:

 var BIT_NONEMPTY=1;
 var BIT_HASERRORS=2;
 var BIT_HASCHILDREN=4;
 var BIT_HASCONTENT=8;

 result_bitfields = 
    (!!countLines())*BIT_NOTEMPTY +
    (!!errorCode())*BIT_HASERRORS +
    (!!firstChild())*BIT_HASCHILDREN +
    (!!getContent())*BIT_HASCONTENT;

Не очень полезно в Javascript, который живет довольно далеко от значений бит, но может быть полезен время от времени.