关于JavaScript的myVar =!!

myVar = !!someOtherVar

本问题已经有最佳答案,请猛点这里访问。

我能解释一下为什么我要用这个吗?

1
myVar = !!someOtherVar;

在非严格类型语言中!运算符将值转换为布尔值。做两次就等于说

1
myVar = (boolean)someOtherVar

请注意,不建议这样做以清楚代码。


这是双重否定,但也适用于类型转换。!somevar将返回一个布尔值(如果somevar是"真的",则返回"真";如果是"假的",则返回"假",如Crockford的讲座所述)。因此,!!somevar将是not(bool),因此它将是布尔值。


(重写以澄清、简化)

该语句执行两个不同的操作:

1
2
myVar = // This portion is a regular assignment, it will store the value of the suffix
        !!someOtherVar; // This portion is evaluated to a boolean result

我想,你真正想问的是!!someOtherVar。答案很简单:它针对someOtherVar的真实性(一个javascript'ism)执行两个逻辑非操作。

换句话说,如果您理解!操作符,那么这只是将其中两个操作符组合在一起(!!不是一个不同的操作符)。通过这样做,它实质上返回了someOtherVar的布尔值——换句话说,它是从someOtherVar的任何类型到boolean的强制转换。

所以…为此,请注意myVar的结果:

1
2
3
myVar = someOtherVar; // myVar will be whatever type someOtherVar is
myVar = !someOtherVar; // myVar will *always be boolean, but the inverse of someOtherVar's truthiness
myVar = !!someOtherVar; // myVar will *always be boolean, and be the equivalent of someOtherVar's truthiness

如果需要将布尔值传递给函数,或者只分析条件语句中布尔值的计算,则会将someOtherVar强制转换为布尔值,方法是将其双重否定。