Я понимаю то, что двойное не оператор делает в JavaScript. Мне любопытно на предмет, это - использование, хотя и корректно ли недавнее утверждение, что я сделал.
Я сказал это if (!!someVar)
никогда не значимо, ни (!!someVar && ...
потому что оба if
и &&
заставит someVar быть оцененным как булевская переменная так!! является лишним.
На самом деле единственное время, когда я мог думать об этом, будет законно использовать двойное не, оператор - то, если Вы хотели сделать строгое сравнение с другим булевым значением (поэтому, возможно, в ответ оценивают, который ожидает TRUE или FALSE явно).
Это корректно? Я начал сомневаться относительно меня, когда я заметил jQuery 1.3.2 используемых оба if (!!someVar)
и return !!someVar && ...
Разве двойное не имеет никакого фактического эффекта в этих ситуациях?
Мое личное мнение - то, что это просто приводит к беспорядку. Если я вижу, если оператор, я знаю, что он оценивает его как булевскую переменную.
В контексте операторов if
Я с вами, это полностью безопасно, потому что внутренне операция ToBoolean
будет выполняться для выражения условия ( см. шаг 3 спецификации ).
Но если вы хотите, скажем, вернуть логическое значение из функции, вы должны убедиться, что результат действительно будет логическим, например:
function isFoo () {
return 0 && true;
}
console.log(isFoo()); // will show zero
typeof isFoo() == "number";
В заключение, Логические операторы может возвращать операнд , но не обязательно логический
результат:
Оператор логического И ( &&
) вернет значение второго операнда , если первый действительно :
true && "foo"; // "foo"
И он вернет значение первого операнда , если он сам по себе ложный :
NaN && "anything"; // NaN
0 && "anything"; // 0
Вкл. с другой стороны, оператор логического ИЛИ ( ||
) вернет значение второго операнда , если первый ложный :
false || "bar"; // "bar"
И он вернет значение первого операнда , если он сам по себе не является ложным:
"foo" || "anything"; // "foo"
Возможно, стоит упомянуть, что ложные значения: null
, undefined
, NaN
, 0
, нулевая линза gth строка и, конечно же, false
.
Все остальное (кроме ложного , логического
объекта или логического
] значения), вычисленное в логическом контексте , будет return true
.
Да, !!var используется, когда вы хотите 0||1 возвращаемое значение.
Первое простое сравнение значений bool, когда вы хотите, чтобы "a == b" было эквивалентно "a 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, который живет довольно далеко от битовых значений, но может быть полезен иногда.