有人可以解释下面代码中双重否定reverse
var的目的吗?
return function (a,b) {
var A = key(a), B = key(b);
return ((A < B) ? -1 :
(A > B) ? +1 : 0)) * [-1,1][+!!reverse];
}
我理解它的方式,目的是从[-1,1]
数组中选择适当的索引,然后在乘法中使用它,但在我看来,[-1,1][+!!reverse];
可以安全地替换为{[-1,1][+reverse];
1}}
我错了吗?通过双重否定reverse
,你获得或阻止了什么?
答案 0 :(得分:5)
最简单的答案可能是一个反例:
+undefined //NaN
+!!undefined // 0
由于[]的内容通常转换为字符串,[NaN]将尝试从数组中访问名为“NaN”的属性,该属性不存在并将返回undefined:
[1,-1][+undefined]
[1,-1][NaN]
[1,-1]["NaN"]
undefined
答案 1 :(得分:4)
双重否定只是确保我们有一个合适的布尔值。因为反转可能是任何东西,双重否定它会调用JavaScript的“虚假”转换。所以,例如:
!!"hello" // true
!!"" // false
!!1 // true
!!some_undefined_var // false
答案 2 :(得分:2)
!!
将值转换为布尔值。如果reverse
不是一个开头的布尔值,则需要这样做。
考虑:+!!"hi"
。这是1
,但+"hi"
是NaN
。
答案 3 :(得分:1)
双重否定基本上将反向转换为布尔值,然后+将该布尔值转换为int。
所以,如果可能反转: “是”,“否”,“”,真实,虚假,0,1,2,未定义
双重否定将使 “是” - &gt;真正 “不” - &gt;真正 “” - &gt;假 是的 - &gt;真正 false - &gt;假 undefined - &gt;假
然后,+会将trues转换为1,并将falses转换为0,以便它可以用作数组索引。