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

我看到这件事的背景是,

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

当前回答

简单地说!!只返回一个布尔值,如果对象不是null或undefined,则返回true,否则返回false。

你可以这么说!!object等于if(object)返回true,否则返回false。

就这么简单!

其他回答

它将Object转换为布尔值。如果为假(例如,0、null、undefined等),则为假,否则为真。

!object  // Inverted Boolean
!!object // Noninverted Boolean, so true Boolean representation

所以不是操作员;这只是!操作员两次。

这样做可能更简单:

Boolean(object) // Boolean

真实世界示例“测试IE版本”:

const isIE8 = !! navigator.userAgent.match(/MSIE 8.0/);
console.log(isIE8); // Returns true or false

如果你⇒

console.log(navigator.userAgent.match(/MSIE 8.0/));
// Returns either an Array or null

但如果你⇒

console.log(!!navigator.userAgent.match(/MSIE 8.0/));
// Returns either true or false

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

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++遗留下来的东西,在那里人们会重写!运算符,但不是布尔运算符。

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

!! 将其右侧的值转换为其等效的布尔值。(想想穷人的“类型转换”方式。)其目的通常是向读者传达,代码不关心变量中的值,而是关心变量的“真值”值。

这个问题已经得到了非常彻底的回答,但我想补充一个答案,我希望这个答案尽可能简化,使!!尽可能简单地掌握。

因为JavaScript具有所谓的“truthy”和“falsy”值,所以有些表达式在其他表达式中求值时会导致true或false条件,即使所检查的值或表达式实际上不是true或false。

例如:

if (document.getElementById('myElement')) {
    // Code block
}

如果该元素确实存在,则表达式将求值为true,并执行代码块。

然而:

if (document.getElementById('myElement') == true) {
    // Code block
}

…将不会导致真条件,并且代码块将不会被执行,即使元素确实存在。

为什么?因为document.getElementById()是一个“truthy”表达式,它在这个if()语句中的值为true,但它不是一个真正的布尔值true。

在这种情况下,双“not”相当简单。这只是背靠背的两个不。

第一个简单地“反转”真值或假值,产生实际的布尔类型,然后第二个简单地将其“反转”回原始状态,但现在是实际的布尔值。这样你就有了一致性:

if (!!document.getElementById('myElement')) {}

and

if (!!document.getElementById('myElement') == true) {}

将如预期的那样返回true。