Статьи

JavaScript Двойное отрицание (!!) Уловка или проблема?

Поэтому меня попросили включить несколько операторов сравнения с двойным отрицанием в мою статью JavaScript Shorthands Techniques, и я решил поближе взглянуть, можем ли мы использовать ее чаще в нашем коде. Смотрите тесты скорости ниже .

!! не оператор. Это просто! оператор дважды

Примеры:

success = !!what()&&that()
return !!value

var x = "somevalue"var isNotEmpty = !!x.length;
Let's break it to pieces:
x.length   // 9
!x.length  // false
!!x.length // true

Следующие значения эквивалентны false в условных выражениях:

 * false
	* null
	* undefined
	* The empty string "" ( '')
	* The number 0
	* The number NaN

Все остальные значения эквивалентны истине.

 !!false === false
           !!true === true

              !!0 === false!!parseInt("foo") === false // NaN is falsy
              !!1 === true
             !!-1 === true  // -1 is truthy

             !!"" === false // empty string is falsy
          !!"foo" === true  // non-empty string is truthy
        !!"false" === true  // ...even if it contains a falsy value

     !!window.foo === false // undefined is falsy
           !!null === false // null is falsy

             !!{} === true  // an (empty) object is truthy
             !![] === true  // an (empty) array is truthy; PHP programmers beware!

Вы также можете использовать функции конструктора, соответствующие типам примитивов (без использования новых), чтобы явно приводить значения, т.е.

 Boolean(foo) === !!foo
Number(foo)  === +foo
String(foo)  === ''+foo

И еще примеры!

 return !!window; //Returns true
return !!null; //Returns false
return !!undefined; //Returns false
return !!false; //Returns false
return !!true; //Returns true
return !!""; //Returns false
return !!"Hi"; //Returns true
return !!0; //Returns false
return !!1; //Returns true

Первое отрицание преобразует данные (независимо от типа данных) в логическое значение. Второе отрицание снова изменяет логическое значение, чтобы дать желаемый результат. Отрицательный регистр. Если значение равно null / undefined / false / ”” / 0, то первое отрицание преобразует его в true. Второе отрицание меняет его на ложное.

Положительный случай

Если значением является object / true / «Value» / 1, то первое отрицание преобразует его в false. Второе отрицание меняет его на истинное.

Является ли двойное отрицание !! (expr) таким же, как Typecasting Boolean (expr)

Да.

 Boolean(5) === !!5; Same casting, fewer characters.

Но, сказав, что посмотри на это! Мозг спешит?

 !!new Boolean(false) // true
!!Boolean(false) // false

Вуаля, объяснения:

new Boolean (false) является объектом, и объект является правдивым, даже если он содержит ложное значение!
Boolean (false) возвращает примитив false.

Скоростные тесты!

двойное отрицание-это-быстрым

булево-против-двойного отрицания

testrz

Причины использования Double Negation

Некоторые люди называют это «двойной отрицательный трюк Javascript». По сути, он преобразует значение (ноль, неопределенное, объекты и т. Д.) В примитивное логическое значение. Аналогично явному приведению типов с использованием Boolean (value), за исключением того, что оно преобразует значение в объект Bololean и не является истинным логическим значением. Трюк с двойным отрицанием можно использовать, чтобы гарантировать, что возвращаемое значение всегда имеет логический тип в методах, которые возвращают логическое значение на основе некоторого условия.

Причины против использования Double Negation

Труднее читать и понимать. Это ужасно неясный способ преобразования типов. ! не является. Так что! True — это ложь, а! False — это правда. ! 0 это правда, а! 1 это ложь.

 // Maximum Obscurity:
val.enabled = !!userId;

// Partial Obscurity:
val.enabled = (userId != 0) ? true : false;

// And finally, much easier to understand:
val.enabled = (userId != 0);

Двойное отрицание в реальном мире

Google Closure компилятор
Стоит отметить, что некоторые минифайеры (такие как Google Closure Compiler) превращаются в true в! 0 и falseinto! 1 для сохранения символов (обратите внимание, что порядок выглядит неудобно, но верно,! 0 === true &&! 1 === false).

Обнаружение поддержки функций HTML5
Мы хотим написать функцию, которая возвращает true, если браузер пользователя поддерживает HTML5

 // this won't tell us anything about HTML5 `` as a featurevar foo = function(tag, atr) { return document.createElement(tag)[atr]; }

// this won't return true if the feature is detected (although it works just fine)var bar = function(tag, atr) { return !document.createElement(tag)[atr]; }

// this is the concise, feature-detecting solution we wantvar baz = function(tag, atr) { return !!document.createElement(tag)[atr]; }

foo('audio', 'preload'); // returns "auto"
bar('audio', 'preload'); // returns false
baz('audio', 'preload'); // returns true

Дальнейшее чтение:
Javascript двойной минус
Двойное побитовое НЕ (~~)
http://stackoverflow.com/questions/784929/what-is-the-not-not-operator-in-javascript