Поэтому меня попросили включить несколько операторов сравнения с двойным отрицанием в мою статью 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.
Скоростные тесты!
Причины использования 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