Javascript Логический оператор:? - PullRequest
3 голосов
/ 28 июня 2011

Я изучал src underscore.js и обнаружил это:

_.isRegExp = function(obj) {
    return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
};

Почему было "!!" используемый? Должно ли оно быть прочитано как НЕ-НЕ или здесь есть какой-то эзотерический нюанс JS?

Ответы [ 4 ]

12 голосов
/ 28 июня 2011

Это просто тупой способ привести результат к логическому значению.

2 голосов
/ 28 июня 2011

Да, это НЕ-НЕ.Обычно используется идиома для преобразования значения в логическое значение эквивалентной истинности.

JavaScript понимает 0.0, '', null, undefined и false как ложное значение и любое другое значение(в том числе, очевидно, true) как правдивый.Эта идиома преобразует все первые в логическое значение false, а все последние в логическое значение true.

В данном конкретном случае

a && b

вернет b, еслиa и b верны;

!!(a && b)

вернет true, если оба a и b верны.

1 голос
/ 28 июня 2011

Оператор && возвращает либо ложное, либо последнее значение в выражении:

("a" && "b") == "b"

|| Оператор возвращает первое значение, которое оценивается как true

("a" || "b") == "a"

The! оператор возвращает логическое значение

!"a" == false

Так что, если вы хотите преобразовать переменную в логическое значение, вы можете использовать !!

var myVar = "a"
!!myVar == true

myVar = undefined
!!myVar == false

и т.д.

0 голосов
/ 28 июня 2011

Это всего два! операторы рядом друг с другом. Но двойное отрицание бессмысленно, если вы не используете !! как оператор для преобразования в логический тип.

Он преобразует все в истинное или ложное ...

...