myVar = !!someOtherVar
我能解释一下为什么我要用这个吗?
在非严格类型语言中!运算符将值转换为布尔值。做两次就等于说
1
| myVar = (boolean)someOtherVar |
请注意,不建议这样做以清楚代码。
- …或者它不是没有被告知?
- @STW:youtube.com/watch?V=0qoya9 LWQK(见1:44和8:38)
- 您可以使用Boolean(someOtherVar)键入cast-in-js。
- @博尔特克——我第一分钟就回想起了巴特斯在南方公园当皮条客的情景,你知道我在说什么吗?
- @穆古——谢谢我的"我怎么不知道这存在?"一天中的某一时刻
- @moogo不是一个"类型转换"——这是一个对象构造,完全不是同一个东西。
- @STW:是的,我知道。
- @要点:在什么情况下,Boolean()和!!之间的区别很重要?
- @chlmertz,@moogo-你是对的;当调用Boolean()构造函数(而不是用new调用)时,它似乎返回true或false—换句话说,是常量,而不是对象。因此,true === Boolean(2)是true,而true === new Boolean(2)是false。MDC页面非常准确地说明了这一点(并且让人好奇对象可能是什么用途)。
- @Chimetz,@moogo我个人仍然不会使用"类型演员"这个词,但我想这只是一个偏好问题。
- 它创建了一个真正的对象来包装原始值。就用途而言,数量不多。您可以向对象添加属性(而对于基元,任何添加的属性都将被忽略),但在比较中它是无用的,因为在JS中对象本身只有==个。我会说"类型转换"是合适的,因为它准确地描述了行为,即使这里的实现与大多数其他语言不同(调用返回值和特殊语法的函数)
这是双重否定,但也适用于类型转换。!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强制转换为布尔值,方法是将其双重否定。