考虑以下代码
var value = 0;
for (var i=0; i < arguments.length; i++) {
value += +!!arguments[i];
}
+!!
在这里做了什么?它是JavaScript中一种好的编程风格吗?
答案 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]
转换为数字时,您将获得true
,1
获取0
。
false
答案 1 :(得分:4)
它不是一个运营商,它是三个:+
然后是!
两次。
这样做会将!
应用于arguments[i]
,将 truthy 值false
或 falsy 值转换为{{1} }},然后应用true
使!
=&gt; false
,反之亦然,然后应用一元true
将结果转换为数字(+
=&gt; true
,1
=&gt; false
)。
falsy 值是强制0
的任何值。虚假值为false
,0
,""
,NaN
,null
,当然还有undefined
。 truthy 值是任何其他值。
因此最终结果是将false
中的真值数量添加到arguments
。
它是JavaScript中的一种好的编程风格吗?
使用value
将真实内容变为!!
,将某些内容变为true
是完全正常的做法。使用一元false
将某些东西转换为数字也是完全正常的做法。
答案 2 :(得分:0)
通常!!
用于将变量转换为布尔类型,+
用于转换为数字。
在这个例子中,它首先转换为布尔值,然后在这种情况下转换为1或0。
变量value
包含传递给函数的truthy个参数。