Что!! (не нет) оператор в JavaScript?
Я видел некоторый код, который, кажется, использует оператор, который я не распознаю, в виде двух восклицательных знаков, например так: !!
, Может кто-нибудь сказать, пожалуйста, что делает этот оператор?
Контекст, в котором я видел это, был,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
43 ответа
!!
похоже на использование логического конструктора или, возможно, больше похоже на логическую функцию.
console.log(Boolean(null)); // Preffered over the Boolean object
console.log(new Boolean(null).valueOf()); // Not recommended for coverting non-boolean values
console.log(!!null); // A hacky way to omit calling the Boolean function, but essentially does the same thing.
// The context you saw earlier (your example)
var vertical;
function Example(vertical)
{
this.vertical = vertical !== undefined ? !!vertical :
this.vertical;
// Let's break it down: If vertical is strictly not undefined, return the boolean value of vertical and set it to this.vertical. If not, don't set a value for this.vertical (just ignore it and set it back to what it was before; in this case, nothing).
return this.vertical;
}
console.log( "\n---------------------" )
// vertical is currently undefined
console.log(new Example(vertical).vertical); // The falsey or truthy value of this.vertical
console.log(!!new Example(vertical).vertical); // Coerced value of this.vertical
vertical = 12.5; // set vertical to 12.5, a truthy value.
console.log(new Example(vertical).vertical); // The falsey or truthy value of this.vertical which happens to be true anyway
console.log(!!new Example(vertical).vertical); // Coerced value of this.vertical
vertical = -0; // set vertical to -0, a falsey value.
console.log(new Example(vertical).vertical); // The falsey or truthy value of this.vertical which happens to be false either way
console.log(!!new Example(vertical).vertical); // Coerced value of this.vertical
Значения Falsey в javascript приводят к значению false, а истинные значения приводят к значению true. Ложные и истинные значения также могут быть использованы в if
заявления и будет по существу "сопоставить" их соответствующее логическое значение. Однако вам, вероятно, не придется часто использовать правильные логические значения, так как они в основном отличаются в выходных данных (возвращаемые значения).
Хотя это может показаться похожим на приведение, в реальности это скорее всего простое совпадение, и оно не "построено" или специально сделано для и не похоже на логическое приведение. Так что давайте не будем называть это так.
Почему и как это работает
Чтобы быть кратким, это выглядит примерно так: ! ( !null )
, В то время как, null
фальшивка, так !null
было бы правдой. затем !true
будет ложным, и это будет по существу инвертировать обратно к тому, что было раньше, за исключением этого времени в качестве надлежащего логического значения (или даже наоборот с истинными значениями, такими как {}
или же 1
).
Возвращаясь к вашему примеру
В целом, контекст, который вы видели, просто корректируется this.vertical
в зависимости от того, vertical
определяется, и если так; для него будет установлено результирующее логическое значение вертикали, иначе оно не изменится. Другими словами, если vertical
определено; this.vertical
будет установлено его логическое значение, в противном случае он останется прежним. Я думаю, что сам по себе является примером того, как вы бы использовали !!
и что он делает.
Пример вертикального ввода / вывода
Запустите этот пример и возитесь с вертикальным значением на входе. Посмотрите, к чему приводит результат, чтобы вы могли полностью понять код вашего контекста. Во входных данных введите любое допустимое значение JavaScript. Не забудьте включить цитаты, если вы тестируете строку. Не обращайте слишком много внимания на CSS и HTML-код, просто запустите этот фрагмент и поэкспериментируйте с ним. Тем не менее, вы можете захотеть взглянуть на не связанный с DOM код JavaScript, хотя (использование конструктора примера и вертикальной переменной).
var vertical = document.getElementById("vertical");
var p = document.getElementById("result");
function Example(vertical)
{
this.vertical = vertical !== undefined ? !!vertical :
this.vertical;
return this.vertical;
}
document.getElementById("run").onclick = function()
{
p.innerHTML = !!( new Example(eval(vertical.value)).vertical );
}
input
{
text-align: center;
width: 5em;
}
button
{
margin: 15.5px;
width: 14em;
height: 3.4em;
color: blue;
}
var
{
color: purple;
}
p {
margin: 15px;
}
span.comment {
color: brown;
}
<!--Vertical I/O Example-->
<h4>Vertical Example</h4>
<code id="code"><var class="var">var</var> vertical = <input type="text" id="vertical" maxlength="9" />; <span class="comment">// enter any valid javascript value</span></code>
<br />
<button id="run">Run</button>
<p id="result">...</p>
Некоторые операторы в JavaScript выполняют неявные преобразования типов, а иногда используются для преобразования типов.
Одинарный !
Оператор преобразует свой операнд в логическое значение и отрицает его.
Этот факт приводит к следующей идиоме, которую вы можете увидеть в своем исходном коде:
!!x // Same as Boolean(x). Note double exclamation mark
!! просто оператор НЕ дважды. чистый эффект - просто преобразовать что-либо, чтобы обеспечить логический тип данных. например.
!!undefined — ложь !!0 — ложь !!null — ложь !!anyobject — истина !!true — истина !!false — ложь !0 — истина !1 — ложь
Чтобы преобразовать переменные JavaScript в логическое значение,
var firstname = "test";
//type of firstname is string
var firstNameNotEmpty = !!firstname;
//type of firstNameNotEmpty is boolean
javascript false для "",0,undefined и null
javascript верен для чисел, отличных от нуля, а не для пустых строк,{},[] и new Date(), поэтому
!!("test") /*is true*/
!!("") /*is false*/
a = 1;
alert(!a) // -> false : a is not not defined
alert(!!a) // -> true : a is not not defined
За !a
проверяет, a
НЕ определяется, пока !!a
проверяет, определена ли переменная
!!a
такой же как !(!a)
, Если a
определено, a
является true
, !a
является false
, а также !!a
является true
,
Это самый простой ответ, который я нашел: он эквивалентенBoolean(value)
в том, как это работает.
Вы можете рассмотреть!!
таким образом:
- При первом применении переменная становится логической, но с противоположным значением.
- Затем, второй
!
просто восстанавливает справедливость и возвращает значение обратно к его первоначальному эквиваленту
!! это не оператор, это просто ! оператор дважды
Но с javascript подайте заявку !! для преобразования объекта в логическое значение в большинстве случаев является избыточным и многословным, потому что:
Любой объект, значение которого не является неопределенным или нулевым, включая логический объект, значение которого равно false, оценивается как true при передаче в условный оператор.
Бывший:
if ({}) { console.log("{} is true")} // logs: "{} is true"
const foo = 'bar';
console.log(!!foo); // Boolean: true
! инвертирует (инвертирует) значение И всегда возвращает / производит логическое значение. Итак!'Bar' вернет false (потому что 'bar' истинно => negated + boolean = false). С дополнительным!, значение снова инвертируется, поэтому false становится истинным.
Двойной ! оценить переменную до ее логического значения. Например: false 0 (ноль), '' или "" (пустая строка), null, undefined, NaN оценивается как false. Смотрите этот пост https://www.sitepoint.com/javascript-truthy-falsy/
Иногда необходимо проверить, есть ли у нас значение в функции или нет, и сама сумма не важна для нас, но имеет ли это значение. например, мы хотим проверить, есть ли у пользователя мажор или нет, и у нас есть такая функция:
hasMajor(){return this.major}//it return "(users major is)Science"
но ответ не важен для нас, мы просто хотим проверить, имеет ли он мажор или нет, и нам нужно логическое значение (true или false), как мы его получаем:
именно так:
hasMajor(){ return !(!this.major)}
или как то же самое
hasMajor(){return !!this.major)}
если this.major имеет значение, то !this.major
вернуть false, но поскольку значение имеет выход, и нам нужно вернуть true, мы используем! дважды, чтобы вернуть правильный ответ !(!this.major)
Просто проверить, существует ли
if(!!isComplianceOnHold){
//write code here is not undefined
//if isComplianceOnHold is undefined or null will not enter in net is false
// if isComplianceOnHold is not null or even boolean net result is true and enter inside if block
}
Любой объект, значение которого не является неопределенным или нулевым, включая логический объект, значение которого равно false, оценивается как true при передаче в условный оператор.
Это действительно удобный способ проверки неопределенности, "неопределенности", нуля, "нуля", ""
if (!!var1 && !!var2 && !!var3 && !!var4 ){
//... some code here
}