2010-06-18 3 views
4

Возможные Дубликаты:
What does this expression mean “!!”
What does the !! operator (double exclamation point) mean in JavaScript?Использование прототипа библиотеки !! Оператор

Вот отрывок из Prototype библиотеки Javascript:

Browser: (function(){ 
    var ua = navigator.userAgent; 
    var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]'; 
    return { 
     IE:    !!window.attachEvent && !isOpera, 
     Opera:   isOpera, 
     WebKit:   ua.indexOf('AppleWebKit/') > -1, 
     Gecko:   ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1, 
     MobileSafari: /Apple.*Mobile/.test(ua) 
    } 
    })(), 

Это все хорошо, и я понимаю цель создание объекта браузера. Одна вещь, которая попалась мне на глаза, и я не смог понять, является использование двойного оператора !! в свойстве IE.

Если вы прочитали код, вы найдете его во многих других местах. Я не понимаю, в чем разница между !!window.attachEvent и использованием только window.attachEvent.

Это просто конвенция или есть еще что-то, что не очевидно?

+3

http://stackoverflow.com/questions/3059546/what-does-this-expression-mean –

+0

@ Daniel Спасибо; Я был уверен, что это произошло раньше, но поиск '!!' довольно затруднен. –

ответ

4

Я не понимаю, Что разница между !!window.attachEvent и использованием только window.attachEvent.

Ключ к пониманию этого, нужно знать, что Boolean Logical Operators может вернуть операнд, а не логический результат обязательно:

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

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

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

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

Итак, в фрагменте !!window.attachEvent && !isOpera мы уже знаем, что isOpera является логическим значением, !! просто убедитесь, что Browser.IE также является логическим результатом.

Пример: предположим, что мы находимся в Firefox, window.attachEvent является undefined и !isOpera является true, если не использовать двойное отрицание, Browser.IE бы undefined вместо false.

+0

+1 для отличного объяснения с примером. слишком хорошо! – Rajat

4

Это довольно распространенный трюк, используемый для принуждения значения к булевскому типу, вместо использования (bool). !window.attachEvent отрицает значение истины window.attachEvent, что дает вам логическое значение; !!window.attachEvent отрицает, что дает вам исходное значение истина, но как логическое вместо типа window.attachEvent

+0

imo это гораздо лучший ответ, чем принятый (что больше говорит о && then !!). –

+0

@Matt, реальный вопрос: «Зачем использовать' !! window.attachEvent &&! IsOpera', а не просто 'window.attachEvent &&! IsOpera', OP действительно не спрашивал, что' !! 'делает (факт, что я думаю, что ОП уже знает). Чтобы понять, зачем вам нужно !!'в этом состоянии вам нужно знать, как ведет себя оператор' && ', это может вызвать путаницу, потому что на других языках логические операторы * всегда * дают логическое значение. Вот почему я говорю о '&&' ;) – CMS

+0

@CMS Я думаю, что он просто спрашивал, в чем смысл двойного отрицания чего-то, он сказал:« Если вы прочитаете код, вы найдете его во многих других местах. Я не понимаю, разница между '!! window.attachEvent' и использованием только' window.attachEvent'; что его пример использовал '&&' было просто совпадением, я думаю. Я нашел ваш ответ образовательным, хотя –