Когда использовать двойной оператор not (!!) в JavaScript - PullRequest
31 голосов
/ 01 февраля 2010

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

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

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

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

Разве двойник не имеет никакого реального эффекта в этих ситуациях?

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

Ответы [ 2 ]

39 голосов
/ 01 февраля 2010

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

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

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

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

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

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

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

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

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

С другой стороны, оператор логического ИЛИ (||) вернет значение второго операнда , если первый из них falsy :

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

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

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

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

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

0 голосов
/ 01 февраля 2010

Да, !! 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, который живет довольно далеко от битовых значений, но иногда может быть полезен.

...