我看到一些代码似乎使用了我不认识的运算符,以两个感叹号的形式,像这样:!!。有人能告诉我这个接线员做什么吗?
我看到这件事的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
我看到一些代码似乎使用了我不认识的运算符,以两个感叹号的形式,像这样:!!。有人能告诉我这个接线员做什么吗?
我看到这件事的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
当前回答
使用逻辑not运算符两次。
这意味着!true=false和!!true=真。
其他回答
!! 不是运算符。这只是!操作员两次。
但使用JavaScript,应用!!在大多数情况下,将Object转换为Boolean是冗余和冗长的,因为:
值未定义或为空的任何对象,包括值为false的布尔对象,传递给有条件的陈述
示例:if({}){console.log(“{}是true”)}//logs:“{}是true”
!!x是布尔(x)的简写。
第一次爆炸迫使JavaScript引擎运行Boolean(x),但它也有反转值的副作用。所以第二次爆炸消除了副作用。
这是我找到的最简单的答案:它的工作方式相当于布尔值。
!! 类似于使用布尔构造函数,或者可以说更像布尔函数。
console.log(布尔值(null));//优先于布尔对象console.log(new Boolean(null).valueOf());//不建议用于转换非布尔值console.log(!!null);//一种省略调用布尔函数的方法,但本质上也是这样。//您之前看到的上下文(您的示例)var垂直;函数示例(垂直){this.vertical=垂直!==未定义!!垂直:此垂直;//让我们来细分一下:如果vertical没有被严格定义,则返回vertical的布尔值并将其设置为this.vertical。如果没有,则不要为this.vertical设置值(只需忽略它并将其重新设置为以前的值;在这种情况下,什么都没有)。返回this.vertical;}console.log(“\n---------------------”)//垂直当前未定义console.log(新示例(垂直)垂直);//这是虚假的还是真实的价值。垂直的console.log(!!new Example(vertical).s垂直);//此垂直强制值垂直=12.5;//将垂直设置为12.5,这是一个真实的值。console.log(新示例(垂直)垂直);//这是假的或真的价值。不管怎样,这都是真的console.log(!!new Example(vertical).s垂直);//此垂直强制值垂直=-0;//将vertical设置为-0,这是一个错误的值。console.log(新示例(垂直)垂直);//这个值是假的还是真的。不管怎样,这个值都是假的console.log(!!new Example(vertical).s垂直);//此垂直强制值
JavaScript中的false值强制为false,truthy值强制为true。Falsy和truthy值也可以在if语句中使用,并基本上“映射”到它们对应的布尔值。然而,您可能不会发现自己必须经常使用正确的布尔值,因为它们在输出(返回值)上大多不同。
虽然这可能看起来类似于选角,但实际上这可能只是一个巧合,并不是为布尔选角而“建造”或故意制造的。所以我们不要这么说。
为什么和如何工作
简而言之,它看起来像这样:!(!null)。然而,null是假的,所以!null将为真。然后true将为false,并且它将基本上反转回以前的状态,除了这次是一个正确的布尔值(或者甚至相反,使用真值,如{}或1)。
回到你的例子
总的来说,您看到的上下文只是根据是否定义了垂直来调整这一点;它将被设置为垂直的布尔值,否则它不会改变。换句话说,如果定义了垂直;this.vertical将设置为它的布尔值,否则,它将保持不变。我想这本身就是一个你会如何使用的例子!!,以及它的作用。
垂直I/O示例
运行此示例并在输入中摆弄垂直值。查看结果强制执行的操作,以便您能够完全理解上下文的代码。在输入中,输入任何有效的JavaScript值。
如果要测试字符串,请记住包含报价。不要太在意CSS和HTML代码,只需运行此代码段并使用它。然而,您可能需要查看与DOM无关的JavaScript代码(使用Example构造函数和垂直变量)。
var vertical=document.getElementById(“vertical”);var p=document.getElementById(“结果”);函数示例(垂直){this.vertical=垂直!==未定义!!垂直:此垂直;返回this.vertical;}document.getElementById(“run”).onclick=函数(){p.innerHTML=!!(新示例(eval(vertical.value)).svertical);}输入{文本对齐:居中;宽度:5米;}按钮{边距:15.5px;宽度:14em;高度:3.4em;颜色:蓝色;}变量{颜色:紫色;}p型{边距:15px;}span注释{颜色:棕色;}<!--垂直I/O示例--><h4>垂直示例</h4><code id=“code”><var class=“var”>var</var>vertical=<input-type=“text”id=“vertical”maxlength=“9”/><span class=“comment”>//输入任何有效的JavaScript值</span></code><br/><button id=“run”>运行</button><p id=“result”></p>
我怀疑这是C++遗留下来的东西,在那里人们会重写!运算符,但不是布尔运算符。
因此,在这种情况下,要获得否定(或肯定)答案,首先需要使用!运算符来获取布尔值,但如果您想检查正数,则可以使用!!。