我看到一些代码似乎使用了我不认识的运算符,以两个感叹号的形式,像这样:!!。有人能告诉我这个接线员做什么吗?

我看到这件事的背景是,

this.vertical = vertical !== undefined ? !!vertical : this.vertical;

当前回答

记住JavaScript中对true和false的求值很重要:

具有“价值”的一切都是真实的(即真实的),例如:101,3.1415,-11,“幸运的大脑”,新建对象()当然,这是真的没有“Value”的所有内容都是假的(即falsy),例如:0,-0,“”(空字符串),未定义,无效的NaN(不是数字)当然,也是假的

应用“逻辑非”运算符(!)计算操作数,将其转换为布尔值,然后对其求反。应用两次将对求反进行求反,从而有效地将值转换为布尔。不应用运算符将只是精确值的常规赋值。示例:

var value = 23; // number
var valueAsNegatedBoolean = !value; // boolean falsy (because 23 is truthy)
var valueAsBoolean = !!value; // boolean truthy
var copyOfValue = value; // number 23

var value2 = 0;
var value2AsNegatedBoolean = !value2; // boolean truthy (because 0 is falsy)
var value2AsBoolean = !!value2; // boolean falsy
var copyOfValue2 = value2; // number 0

value2=值;指定精确的对象值,即使它不是布尔值,因此value2不一定最终是布尔值。value2=!!价值作为操作数值的双重否定的结果,指定一个保证布尔值,它相当于以下内容,但要短得多,可读性强:

if(值){value2=真;}其他{value2=false;}

其他回答

要将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 */

我怀疑这是C++遗留下来的东西,在那里人们会重写!运算符,但不是布尔运算符。

因此,在这种情况下,要获得否定(或肯定)答案,首先需要使用!运算符来获取布尔值,但如果您想检查正数,则可以使用!!。

!! 类似于使用布尔构造函数,或者可以说更像布尔函数。

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>

它将后缀转换为布尔值。

这是检查未定义、“未定义”、null、“null”、“”

if (!!var1 && !!var2 && !!var3 && !!var4 ){
   //... some code here
}