[-1,1] [+ !! boolean_var]的含义

时间:2012-03-30 20:21:18

标签: javascript

有人可以解释下面代码中双重否定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,你获得或阻止了什么?

我在this answer.

上看到了上述代码

4 个答案:

答案 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,以便它可以用作数组索引。