[-1,1][+!!boolean]
我在调试 JS 代码时发现了这一行。顾名思义,var boolean 可以具有真值或假值。
嗯,真恶心。这是发生了什么:
!!boolean
这变成boolean
了一个真/假布尔值。是!
否定,所以当你做两个时,你强制否定的否定,或者原始的布尔值。基本上,它确实:
var x = boolean;
if (x) {
x = true;
} else {
x = false;
}
把+
右边变成一个数字。+true
->1
和+false
-> 0
。
第一位是一个数组。它通过右侧的任何内容来索引该数组文字。
简而言之,如果boolean
为真,则抓取第二个元素,否则抓取第一个。
[-1,1][+!!true] === 1
[-1,1][+!!false] === -1
一个不那么糟糕的版本(使用三元):
var x = boolean ? 1 : -1;
或滥用&&
and ||
:
var x = (boolean && 1) || -1;
第一位创建一个包含两个值的数组:
[-1,1]
第二位通过进行双重反转来确保“布尔”实际上是一个布尔值:
!!boolean == boolean
加号运算符用于将此布尔值转换为数字,其中true => 1
和false => 0
。
最终,该数字用于选择该数组中的两个值之一,即该表达式将“真”变为 1,将“假”变为 -1。
但是,这可能更具可读性:
boolean ? 1 : -1;
表达式是一个包含值和[-1,1]
的数组。-1
1
第二组括号从数组中获取一个值。例如,如果x
是一个数组,则x[0]
获取第一个元素。如果我们写y = [-1,1][0]
,这与以下内容相同:
var x = [-1,1];
y = x[0];
那么,现在呢+!!boolean
?好吧,!
如果它不是“假的”,则将值转换为布尔值。如果它是真的,如果它是假的,那么再次应用!
就会转换它。(我推荐这个谷歌搜索的术语真假)true
false
最后,+
(正)运算符将其转换为数字。将其视为-
(负)运算符的反面。因此+true
转换为1
并+false
转换为-1
.
如果您要采用它的扩展形式并将其编写为函数,那就是它(在我看来):
function( value ){
var output_values = [ -1, 1 ]
, boolean = !!value
, index = +boolean
;
return output_values[ index ];
}
它试图根据一个变量从第一个数组中选择一个元素:
[-1,1][INDEX BASED ON BOOLEAN VALUE]
该代码相当于:
var myArr = [-1,1];
var selected = null;
if(boolean === false ){
selected = myArr[0];
}
else {
selected = myArr[1];
}
说明:
[+!!boolean]
将根据 boolean 的值返回 0 或 1,已完成双重否定以将所有虚假值(如 false、空数组、未定义、空对象)转换为布尔值 false,并将真值转换为布尔值 true。将 a+
放在它们前面会将它们类型转换为整数,从而使其成为目标数组 [-1,1] 的有效索引 0 或 1