Когда использовать двойной (!!) оператор в JavaScript
Я понимаю то, что делает двойной оператор не в JavaScript. Мне интересно, как это использовать, и действительно ли последнее утверждение, которое я сделал, правильно.
Я сказал, что if (!!someVar)
никогда не имеет смысла и не является (!!someVar && ...
, потому что и теги if
, и &&
будут вызывать someVar как логическое, так что!! является излишним.
Фактически, единственный раз, когда я мог думать о том, что было бы законно использовать double not operator, нужно ли строгое сравнение с другим логическим значением (так что, возможно, в возвращаемом значении, которое ожидает true или false явно).
Это правильно? Я начал сомневаться в себе, когда заметил, что jQuery 1.3.2 используется как if (!!someVar)
, так и return !!someVar && ...
Имеет ли двойник никакого фактического эффекта в этих ситуациях?
Мое личное мнение состоит в том, что это просто приводит к путанице. Если я вижу оператор if, я знаю, что он оценивает его как логическое.
Ответы
Ответ 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, который живет довольно далеко от значений бит, но может быть полезен время от времени.