什么" + !!"用JavaScript做什么?

时间:2016-01-16 09:28:50

标签: javascript

考虑以下代码

var value = 0;
for (var i=0; i < arguments.length; i++) {
    value += +!!arguments[i];
}

+!!在这里做了什么?它是JavaScript中一种好的编程风格吗?

3 个答案:

答案 0 :(得分:6)

from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm import matplotlib.pyplot as plt import numpy as np fig = plt.figure(figsize = (18,12)) rect = fig.add_subplot(2, 3, 2).get_position() ax = Axes3D(fig, rect) X = np.arange(-5, 5, 0.025) Y = np.arange(-5, 5, 0.025) X, Y = np.meshgrid(X, Y) R = np.sqrt(X**2 + Y**2) Z = np.sin(R) surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet) ax.view_init(azim=-90, elev=90) ax.axis('off') plt.show() 是一个常见的习惯用法,它将逻辑否定应用两次,将表达式!!arguments[i]转换为实际的布尔值。

例如,

arguments[i]

为什么我们需要两个逻辑否定?因为,它不会改变数据的奇偶校验。例如,

如果数据最初是Truthy,那么console.log(!!{}); // true 将变为!Truthy,然后再将其反转false,您将获得!false

如果数据最初是Falsy,那么true将变为!Falsy,然后再将其反转true,您将获得!true

false开头的+运算符是为了确保从布尔值中获取Number值(因为+!!arguments[i]保证给出布尔值)。

在JavaScript中,当!!arguments[i]转换为数字时,您将获得true1获取0

false

答案 1 :(得分:4)

它不是一个运营商,它是三个:+然后是!两次。

这样做会将!应用于arguments[i],将 truthy false falsy 值转换为{{1} }},然后应用true使! =&gt; false,反之亦然,然后应用一元true将结果转换为数字(+ =&gt; true1 =&gt; false)。

falsy 值是强制0的任何值。虚假值为false0""NaNnull,当然还有undefined truthy 值是任何其他值。

因此最终结果是将false中的真值数量添加到arguments

  

它是JavaScript中的一种好的编程风格吗?

使用value将真实内容变为!!,将某些内容变为true是完全正常的做法。使用一元false将某些东西转换为数字也是完全正常的做法。

答案 2 :(得分:0)

通常!!用于将变量转换为布尔类型,+用于转换为数字。 在这个例子中,它首先转换为布尔值,然后在这种情况下转换为1或0。 变量value包含传递给函数的truthy个参数。