Заварить чай:
!!
не является оператором. Это двойное использование !
- это логический оператор «не».
В теории:
!
определяет «истину» того, что не является значением:
false
не true
(поэтому !false
приводит к true
) true
не false
(поэтому !true
приводит к false
) !!
определяет «истину» того, что значение не не:
true
не не true
(поэтому !!true
приводит к true
) false
не не false
(поэтому !!false
приводит к false
) . Мы хотим определить в сравнении «правду» о значение ссылки, а не значение самой ссылки. Существует прецедент, где нам может понадобиться знать правду о значении, даже если мы ожидаем, что значение будет false
(или falsey), или если мы ожидаем, что значение не будет typeof boolean
.
На практике:
Рассмотрим краткую функцию, которая обнаруживает функциональность функциональности (и в этом случае совместимость с платформой) посредством динамического ввода ( aka «утиная печать»). Мы хотим написать функцию, которая возвращает true
, если браузер пользователя поддерживает элемент HTML5 , но мы не хотим, чтобы функция выдавала ошибку, если
не определено; и мы не хотим использовать
try ... catch
для обработки любых возможных ошибок (потому что они валовые); , а также мы не хотим использовать проверку внутри функции, которая не будет постоянно показывать правду об этой функции (например, document.createElement('audio')
все равно будет создавать элемент с именем , даже если HTML5
не поддерживается).
Вот три подхода:
// this won't tell us anything about HTML5 `
Каждая функция принимает аргумент для поиска
и attribute
для поиска, но каждый из них возвращает разные значения, основанные на том, что определяют сравнения.
Но подождите, есть еще!
Некоторые из вас, вероятно, заметили, что в этом конкретном примере можно просто проверить свойство с помощью немного более совершенного средство проверки того, имеет ли объект, о котором идет речь свойство . Есть два способа сделать это:
// the native `hasOwnProperty` method
var qux = function(tag, atr) { return document.createElement(tag).hasOwnProperty(atr); }
// the `in` operator
var quux = function(tag, atr) { return atr in document.createElement(tag); }
qux('audio', 'preload'); // returns true
quux('audio', 'preload'); // returns true
Мы отвлекаемся ...
. В редких случаях это может быть, может существовать несколько сценариев, в которых наиболее сжатые, наиболее результативные , и поэтому наиболее предпочтительным способом получения true
из небулевого, возможно неопределенного значения, является использование !!
. Надеюсь, это смешно очистит его.
Вместо макета Flexbox используйте вид рециркулятора с диспетчером макетов сетки. Например:
recyclerView.setLayoutManager(new GridLayoutManager(this,3));