Javascript [-1,1][+;!!布尔值的含义]

Javascript [-1,1][+;!!布尔值的含义],javascript,Javascript,有人能解释一下在下面的代码中双重否定反向var的目的吗 return function (a,b) { var A = key(a), B = key(b); return ((A < B) ? -1 : (A > B) ? +1 : 0)) * [-1,1][+!!reverse]; } 返回函数(a、b){ 变量A=键(A),B=键(B); 返回值((AB)?+1:0))*[-1,1][+!!反向]; }

有人能解释一下在下面的代码中双重否定
反向
var的目的吗

return function (a,b) {
   var A = key(a), B = key(b);
   return ((A < B) ? -1 :
           (A > B) ? +1 : 0)) * [-1,1][+!!reverse];                  
}
返回函数(a、b){
变量A=键(A),B=键(B);
返回值((AB)?+1:0))*[-1,1][+!!反向];
}
按照我的理解,目的是从
[-1,1]
数组中选择适当的索引,然后在乘法中使用它,但在我看来,
[-1,1][+!!reverse]
可以安全地替换为
[-1,1][+反向]

我错了吗?在那里,双重否定
反向
可以获得或阻止什么


我在

上看到了上述代码最简单的答案可能是一个反例:

+undefined //NaN
+!!undefined // 0
由于[]的内容通常转换为字符串,[NaN]将尝试从数组中访问名为“NaN”的属性,该属性不存在,并将返回未定义的:

[1,-1][+undefined]
[1,-1][NaN]
[1,-1]["NaN"]
undefined

双重否定可以确保我们有一个正确的布尔值。因为反向可以是任何东西,所以双重否定它会调用JavaScript的“falsy”转换。例如:

!!"hello" // true
!!"" // false
!!1 // true
!!some_undefined_var // false

将值转换为布尔值。如果
reverse
不是一个布尔值,则需要使用此选项


考虑:
+!!“嗨”
。这是
1
,但
+“hi”
NaN

双否定基本上将反向转换为布尔值,然后+将该布尔值转换为int

因此,如果反向可能是: “是”、“否”、“正确”、“错误”、0,1,2、未定义

双重否定会使人失望 “是”->对 “否”->正确 “”->错误 真->真 假->假 未定义->错误


然后,+将trues转换为1,False转换为0,这样就可以将其用作数组索引。

这太棒了,很想知道这个问题的答案。它将reverse的值更改为布尔值。我会使用
(reverse?1:-1)
而不是
[-1,1][+!!reverse]
,IMO更清晰,更便宜,它不需要数组对象和访问索引,甚至布尔转换也是由条件运算符隐式进行的…@CMS我同意,如果整个目的只是在为true时乘以1;否则通过-1,
reverse?1:-1
更清晰、更便宜。谢谢,我觉得我需要尽快运行并购买一本Javascript书籍:$